.NET程序集的编译目标平台:X86 &AnyCPU &X64
在我们测试平台上发布客户端组件,经常会碰到因为build的版本是x86还是anycpu而引起的application error的问题。借此,研究了一下X86,X64,AnyCPU的区别。
使用.net平台自带的工具CorFlags的可以查看组件详细版本信息。下图比较了3种编译配置得到的组件的CLR头信息:
|
anycpu |
x86 |
x64 |
|
Collapse | Copy Code Version : v4.0.30319 CLR Header: 2.5 PE : PE32 CorFlags : 1 ILONLY : 1 32BIT : 0 Signed : 0 |
Collapse | Copy Code Version : v4.0.30319 CLR Header: 2.5 PE : PE32 CorFlags : 3 ILONLY : 1 32BIT : 1 Signed : 0 |
Collapse | Copy Code Version : v4.0.30319 CLR Header: 2.5 PE : PE32+ CorFlags : 1 ILONLY : 1 32BIT : 0 Signed : 0 |
留意2个比较重要的参数:PE, 32BIT
PE: PE32能够在32位和64位OS上运行, PE32+ 只能够在64位的OS上运行。
32BIT: 1表示只能在32位的CLR版本上运行,当然0表示可以在32/64位的CLR上运行。
结论:
在 64位 Windows OS上:
用 x86编译的程序集将在 WOW64 下运行的 32 位 CLR 上执行。
用 x64编译的程序集将在 64 位 CLR 上执行。
用 anycpu 编译的可执行文件将在 64 位 CLR 上执行。
用 anycpu编译的 DLL 将在与加载它的进程相同的 CLR 上执行。
在 32位 Windows OS上:
用 x86或anycpu 编译的程序集将在 32 位 CLR 上执行。
用 x64 编译的程序集无法运行。
那为什么我们往测试版上发布的一些客户端dll会造成错误呢?要看看我们的启动程序(可执行exe)到底是什么版本,x86呢还是anycpu.比较了以下production和Dev的客户端,结果如下:
Production版本的exe

Dev版本的exe

由于Dev版本的exe是anycpu版本的,所以在OS是64位的情况下,使用的是64位的CLR,
而此时如果它要加载的客户端dll是x86版本的只能在32位版本的CLR下运行,所以就会报错。
相反,production版本的exe是x86的,所以使用的是WOW64 下运行的 32 位 CLR,而此时,
不管它要加载的客户端dll是x86还是anycpu的,都不会有问题,因为用 anycpu编译的 DLL可以再任何版本的CLR运行。
所以,究其原因,是我们在打包client组件的时候,使用的是anycpu,而不是像production那样使用x86的原因。
.NET程序集的编译目标平台:X86 &AnyCPU &X64的更多相关文章
- cmake编译(编译目标)x86或x64
if(CMAKE_CL_64) #CMAKE的内建变量,如果是true,就说明编译器的64位的,自然可以编译64bit的程序 set(ADDRESS_MODEL 64) set(NODE_TAR ...
- 技巧:如何区分dll程序集的编译目标平台(同样适用于查看程序集的其它依赖)
我们在进行net core迁移过程中,有时候需要区分一个dll是针对netstandard平台还是net framework. 本文提供一个技巧来快速区分:通过工具dnSpy打开目标dll,按照如下截 ...
- 面向amd64的XXX与与项目的目标平台“x86”不兼容
打开IIS服务器,选择应用程序池,设置中,有一个打开32位程序,选择FALSE,如果开启,在64位下就会出错.一般关闭
- C#编译器选项(目标平台)
用vs编译C#项目的设置中,“属性-生成-目标平台”有anycpu,x86,x64等选项. anycpu(默认值)将编译程序集为使其在任意平台上都可以运行. 在任何可能的时候,应用程序作为 64 位进 ...
- 如何判断exe或dll的目标平台及是否是.NET?
1. COFF文件头中偏移0处的Machine指示目标机器类型(IMAGE_FILE_MACHINE_AMD64等),偏移18处的Characteristics位指示文件属性(IMAGE_FILE_3 ...
- Asm.js: Javascript的编译目标
正如许多开发者一样,我也为Asm.js的前景而感到兴奋不已.最近的新闻——Asm.js正 在被Firefox支持——引起了我的兴趣.同样感兴趣的还有Mozilla和Epic声明(mirror)他们已经 ...
- .NET编译的目标平台(AnyCPU,x86,x64)
转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...
- 关于.NET编译的目标平台(AnyCPU,x86,x64)
转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...
- 关于.NET编译的目标平台(AnyCPU,x86,x64) (转)
关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . ...
随机推荐
- php 添加钩子实例
<?php/*定义钩子函数*/function add($hook,$actionFunc){ global $emHooks; if(isset($emHooks[$hook])) ...
- linux下安装nodejs
之前安装过windows下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 1. 下载node.js,官方有提供源码版本和编译版的,方便起见我使用编译版的,下载后解压缩 ...
- 用shebang编写一个ssh自动登陆脚本
单例模式是软件开发中非常普遍的一种模式.它的主要作用是确保系统中,始终只存在一个类的实例对象. 这样做的好处有两点: 1.对于需要频繁使用的对象,在每次使用时,如果都需要重新创建,并且这些对象的内容都 ...
- Unity 脚本生命周期流程图
渲染 OnPreCull: 在相机剔除场景之前调用此函数.相机可见的对象取决于剔除.OnPreCull 函数调用发生在剔除之前. OnBecameVisible/OnBecameInvisible: ...
- 【转】怎么让VS2015编写的程序在XP中顺利运行
1. 概述 默认配置下VS2015编写的应用程序只能在Win8/Win10上运行.但幸好还保留了生成XP程序的设置项.XP和Win2003的用户还是大量存在的,我们程序软件的发布不能不考虑他们.另外X ...
- LeetCode "477. Total Hamming Distance"
Fun one.. the punch line of this problem is quite common in Bit related problems on HackerRank - vis ...
- protobuf C++ 使用示例
1.在.proto文件中定义消息格式 2.使用protobuf编译器 3.使用c++ api来读写消息 0.为何使用protobuf? 1.原始内存数据结构,可以以二进制方式sent/saved.这种 ...
- ruby HTTPS请求
require 'uri'require 'net/http'require 'net/https' @toSend = { "date" => "2012-07- ...
- 数据库MySQL基本语法思维导图
- tinyPng Photoshop Plugin 安装的坑
一定要注意两点: 第一: 注册表注册路径要修改为自己安装ps cc时的注册表路径[HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\70.0]第二: Applic ...