在我们测试平台上发布客户端组件,经常会碰到因为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. CGRectInset & CGRectOffset

    1.CGRectInset CGRect CGRectInset (   CGRect rect,   CGFloat dx,   CGFloat dy);以原rect为中心,再参考dx,dy,进行缩 ...

  2. Python图片处理

    Python图像处理库PIL基本使用 #将图片转换为灰度图像 from PIL import Image pil_im = Image.open('cat.jpg') gray_cat = pil_i ...

  3. zabbix3.0安装【server】

    关于zabbix的介绍,就不多说了,功能强大,架构前卫,自己直接去官网研究 在这里,还是秉承研究一个应用或者技术,都要自己动手安装部署,实战操作,才能深入掌握,基于这个精神,zabbix从安装部署开始 ...

  4. 1、SQL可搜索可排序可分页存储过程, 2、范围内的随机时间 适用于sql 2008以上

    -- ============================================= -- Author: 蜘蛛王 -- Create date: 2015-10-29 -- Descri ...

  5. D 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)

    最熟悉的陌生人 作者:张慧桥 “蝶恋花” 我匆匆地跟听众道了声再见,手忙脚乱地关掉了机器,拿出手机按下了一个快捷键…… “嘟…嘟…” 电话响两下后,我听到了那个我在睡梦中都可以认出来的声音. “你现在 ...

  6. C#:优惠券代码

    static Random random = new Random(); List<string> generatedVouchers = new List<string>() ...

  7. MyBatis入门学习教程-Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  8. [SI]source insight使用

    1. 快捷键 Ctrl+O: 工程中查找需要的文件如imx.c Ctrl+F: 当前文件查找字符串,然后Alt+W(hole)可以列出所有找到的位置 Ctrl+/:可以在当前project中查找字符串 ...

  9. 【巩固】bootstrap笔记二

    这段主要记录如何给排版完的页面加一些动画效果,用到了的插件有: wow.min.js jquery.singlePageNav.min.js animate.css 将导航条上对应的菜单和页面上对应的 ...

  10. 关于Exception

    Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"   1.java.lang ...