关于C#编写x86与x64程序的分析

电脑硬件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。ui

如今考虑一种状况
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位的程序,效率不高,浪费了咱们的资源。操作系统

相关文章
相关标签/搜索