电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系统,不能够很充分的利用这台机器的资源。x86程序,即适用于32为操作系统的程序,x64即适用于64位操作系统的程序。64位系统上依然可以运行32位的程序,但是这是通过WOW64来运行,通俗上讲,就是模拟出一个32位的CPU来运行这个程序。

接下来是C#程序的编译运行,分为两步,第一步是编译成IL,在编写C#程序的时候,需要考虑到在最终程序需要在哪种环境下运行。Build中默认的环境是Any CPU,还有X86,X64. 这些有什么不同?根据名字,我们可能认为,编译器会根据选择的环境不同来生成不同的二进制文件。然而,C#编译器只是把代码编译成为了IL代码,以dll的形式。然后再程序运行的时候,JIT编译器才把IL代码编译为CPU能够识别的二进制码。所以,无论选择哪个环境,都不会影响dll的生成,只是在dll的头文件中加入了一些平台信息,最终运行的时候JIT会根据这些信息来编译dll给CPU处理。

x86编译的dll和x64编译的dll是不能相互引用的,否则会抛出程序集不能下载的异常。Any CPU编译的dll,被哪种类型的程序调用,就会编译成哪种类型的dll.现在考虑一种情况
A项目是Console Application, B项目是Class Library, 在64位操作系统的机器上。A项目为Start Project,决定了这个程序的32位还是64位的属性。如果A设置为x86, A决定了这个程序为32位,B设置为x86, 因为两个项目都是同一类型,虽然都是32位,但可以在64位系统上运行。如果A为Any CPU, B为x86,就会出问题。因为A虽然为Any CPU,但是在64位操作系统上运行,就会转换成64位的dll,A决定了这个程序为64位,然后再调用32位的dll,就会出问题。如果A为x86, B为Any CPU, 就不会出问题。 因为A决定了这个程序为32位,调用B的时候就会把B转成32位,一切正常。

有人说,难道不可以一直把Project设置为Any CPU吗?因为现在很多的系统都是64位的,所以我们的程序设置成Any CPU, 在64位机器上跑的时候就是64位的程序,但是这些程序很多时候需要使用一些组件,比如COM组件等,而这些组件仅仅是32位的dll,根本不支持64位,当我们用64位的程序调用这些dll的时候就会有问题。所以,这时候,我们就需要把我们的程序设置成x86.

那么有人说,那都设置为x86不就可以了?那么现在我们就要保证我们的程序引用的dll都是32位的。虽然很多第三方的dll都提供32位与64位两个版本,基本上可以保证这一点。但是如果没有必要做成32位的程序,单纯是为了方便,我们前边说过64位的系统运行32位的程序,效率不高,浪费了我们的资源。
---------------------
作者:孙大诚_SunRobin
来源:CSDN
原文:https://blog.csdn.net/sundacheng1989/article/details/18349503
版权声明:本文为博主原创文章,转载请附上博文链接!

C# 关于X86/X64/AnyCpu 的关系的更多相关文章

  1. 『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译

    背景: > System.Data.SQLite.dll 程序集 不能良好的支持 AngCPU 格式 System.Data.SQLite.dll 在 适应 x86 和 x64 有三个方案: & ...

  2. vs2010 编译平台 X86 X64 anycpu

    X86既32位程序,X64既64位程序,anycpu会根据当前的操作系统位数决定 但是如果应用程序编译成anycpu,会由操作系统位数决定,如果是dll之类的,会由调用dll的主程序位数决定 所以一般 ...

  3. x86/x64/AnyCPU之间的区别

    原文链接 http://blog.csdn.net/lordwish/article/details/52312015 x86操作系统 目标平台 程序类型 运行结果 x86 应用程序exe 在32位C ...

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

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

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

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

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

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

  7. 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY

    转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...

  8. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  9. 关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别

    相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...

随机推荐

  1. Lodop提示BarCode Type(ena13)Invalid!

    前段时间遇到过一个奇怪的问题,就是代码里本身都是ENA13大写,却提示条码类型无效,而且进入打印设计后,选中打印项,条码类型变成了code39,但是实际是还有条码类型参数都是正确的,代码看上去没有问题 ...

  2. java8list排序

    https://blog.csdn.net/york_2016/article/details/80169467

  3. [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP

    题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...

  4. MySQL——修改用户密码 | 移除权限

    修改用户密码 '; 移除权限 REVOKE Delete, Drop ON *.* FROM `root`@`localhost`; 权限列表

  5. 树莓派3B+(三)

    上一篇中,我们配置好了基本的raspbain系统,接下来我们可以用xrdp或者vnc在Windows上远程连接树莓派. 一.安装xrdp xrdp和vnc是两种常见的远程桌面协议,可以进行可视化界面远 ...

  6. ORM表相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 > all(): 查询所有结果 > filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 > get( ...

  7. GWAS基因芯片数据预处理:质量控制(quality control)

    一.数据为什么要做质量控制 比起表观学研究,GWAS研究很少有引起偏差的来源,一般来说,一个人的基因型终其一生几乎不会改变的,因此很少存在同时影响表型又影响基因型的变异.但即便这样,我们在做GWAS时 ...

  8. \t \r \n \f

    \t 的意思是 :水平制表符.将当前位置移到下一个tab位置. \r 的意思是: 回车.将当前位置移到本行的开头. \n 的意思是:回车换行.将当前位置移到下一行的开头. \f的意思是:换页.将当前位 ...

  9. Java基础--常见计算机编码类型

    计算机编码指电脑内部代表字母或数字的方式,常见的编码方式有:ASCII编码,GB2312编码(简体中文),GBK,BIG5编码(繁体中文),ANSI编码,Unicode,UTF-8编码等. 1.ASC ...

  10. The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online J - Press the Button(思维)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4056 题意 有一个按钮.一个灯.一个计时器和一个计数器,每按一次按钮,计时 ...