在我们测试平台上发布客户端组件,经常会碰到因为build的版本是x86还是anycpu而引起的application error的问题。借此,研究了一下X86,X64,AnyCPU的区别。

使用.net平台自带的工具CorFlags的可以查看组件详细版本信息。下图比较了3种编译配置得到的组件的CLR头信息:

anycpu

x86

x64

Collapse | Copy Code

  1. Version   : v4.0.30319
  1. CLR Header: 2.5
  1. PE        : PE32
  1. CorFlags  : 1
  1. ILONLY    : 1
  1. 32BIT     : 0
  1. Signed    : 0

Collapse | Copy Code

  1. Version   : v4.0.30319
  1. CLR Header: 2.5
  1. PE        : PE32
  1. CorFlags  : 3
  1. ILONLY    : 1
  1. 32BIT     : 1
  1. Signed    : 0

Collapse | Copy Code

  1. Version   : v4.0.30319
  1. CLR Header: 2.5
  1. PE        : PE32+
  1. CorFlags  : 1
  1. ILONLY    : 1
  1. 32BIT     : 0
  1. 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的更多相关文章

  1. cmake编译(编译目标)x86或x64

    if(CMAKE_CL_64)    #CMAKE的内建变量,如果是true,就说明编译器的64位的,自然可以编译64bit的程序 set(ADDRESS_MODEL 64) set(NODE_TAR ...

  2. 技巧:如何区分dll程序集的编译目标平台(同样适用于查看程序集的其它依赖)

    我们在进行net core迁移过程中,有时候需要区分一个dll是针对netstandard平台还是net framework. 本文提供一个技巧来快速区分:通过工具dnSpy打开目标dll,按照如下截 ...

  3. 面向amd64的XXX与与项目的目标平台“x86”不兼容

    打开IIS服务器,选择应用程序池,设置中,有一个打开32位程序,选择FALSE,如果开启,在64位下就会出错.一般关闭

  4. C#编译器选项(目标平台)

    用vs编译C#项目的设置中,“属性-生成-目标平台”有anycpu,x86,x64等选项. anycpu(默认值)将编译程序集为使其在任意平台上都可以运行. 在任何可能的时候,应用程序作为 64 位进 ...

  5. 如何判断exe或dll的目标平台及是否是.NET?

    1. COFF文件头中偏移0处的Machine指示目标机器类型(IMAGE_FILE_MACHINE_AMD64等),偏移18处的Characteristics位指示文件属性(IMAGE_FILE_3 ...

  6. Asm.js: Javascript的编译目标

    正如许多开发者一样,我也为Asm.js的前景而感到兴奋不已.最近的新闻——Asm.js正 在被Firefox支持——引起了我的兴趣.同样感兴趣的还有Mozilla和Epic声明(mirror)他们已经 ...

  7. .NET编译的目标平台(AnyCPU,x86,x64)

    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...

  8. 关于.NET编译的目标平台(AnyCPU,x86,x64)

    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...

  9. 关于.NET编译的目标平台(AnyCPU,x86,x64) (转)

    关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . ...

随机推荐

  1. 浏览器angent分析工具

    cz.mallat.uasparser.UserAgentInfo info = null; info = uasParser.parse(userAgent);

  2. code complete part1

    最近在看code complete,学习了一些东西,作为点滴,记录下来. 关于类: 类的接口抽象应该一致 类的接口要可编程,不要对类的使用者做过多的假设.不要出现类似于:A的输入量一定要大于多少小于多 ...

  3. 由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题

    1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements Message ...

  4. tcpdf最新版 6.2版

    tcpdf6.2版,地址记 录 http://download.csdn.net/detail/hayywcy/9547873

  5. subprocess模块

    subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互.它的构造函数如下: subp ...

  6. linux memory

    http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory/ http://duartes.org/gustavo/ ...

  7. openjudge 螺旋加密

    /*======================================================================== 25:螺旋加密 总时间限制: 1000ms 内存限 ...

  8. Fatal error 829---数据库 ID 8,页 (1:80740) 已标记为 RestorePending,可能表明磁盘已损坏(日志备份和热备、双机的重要性)

    问题现象: 在业务数据库中查询:SELECT a.NAME FROM SYSOBJECTS a WHERE a.NAME LIKE '%2015' AND a.XTYPE='u' 提示:消息 21,级 ...

  9. ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=InnoDB' at line 7

    问题: 使用hibernate4.1.1,数据库使用mysql5.1.30,使用hibernate自动生成数据库表时,hibernate方言使用org.hibernate.dialect.MySQLI ...

  10. [zz]Maya C++ API Programming Tips

    Maya C++ API Programming Tips source : http://wanochoi.com/?page_id=1588 How to handle the multiple ...