在32位机器和64位机器上部署的一些区别

      我们平时总听到说64位的机器,64位的软件,64位与32位到底有什么区别呢。其实一个完整的64位电脑应用程序应该是这样的:

      电脑的CPU是64位的,也就是说电脑的硬件支持64位,然后电脑的系统要是64位的,最后应用程序也要是64位的。这样才能说我的应用程序是在64位模式下运行的,只有这样才算真正的64位。

      计算机的位数是指CPU一次能处理的最大位数,如果是32位,那么代表寄存器和寻址总线是32位,也就是说一次可以提取32位数据(4个字节,32bit=4Byte)。它能使用的最大虚拟内存就是2^32,也就是4GB的大小。所以32位CPU有4G左右的内存寻址空间。后来由于4GB的虚拟内存空间渐渐的不够用,64位的个人计算机才慢慢出现(很早以前,64位的机器就已经应用于大型计算机及工作站中),64位也就是意味着寄存器以及寻址总线都是64位的。64 位架构的出现,有效的将内存上限提升至 2^64 地址,16 EB 的内存。(1EB=1024PB,1PB=1024TB,1TB =1024GB)。

     从32位到64位架构的改变是一个根本的改变,大多数操作系统需要进行全面性的修改,才能充分利用64位的性能。以前的应用软件也需要进行修改,才能应用其新的性能(来自百度百科)。

     一般64位的操作系统能同时支持64位的应用程序以及32位的应用程序。如果我们在项目中引用了第三方组件,而这个第三方组件是分32位和64位的,如果按照以前的方式进行部署,一些功能在64位机器上就不可用。理论上有两种方法可以解决这个问题。一种是以真64位模式运行,另外一种是假64位模式运行。

64位模式:

      所谓真64位模式运行,也就是编译的时候,所有的项目都是以AnyCpu的模式进行编译,如果用到了第三方组件,那么整个程序就要分两个版本,假如用到了第3方组件SqLite,如果要以真64位模式运行,那么就需要把项目打包成二个版本,一个是专门在64位上安装的版本,它引用的SqLite也必须是64位的,另一版本是在32位上部署的版本,它引用的SqLite是32位的。编译好了之后,这只是第一步。第二步(这一步是针对使用了WCF的项目来说的),启动64位机器上IIS,新建一个应用程序池,设置这个应用程序池的属性,把“启用32位应用程序”设置为False(默认本身是False),然后设置WCF的应用程序池为你刚才新建的那个应用程序池。

clip_image002

       这样就可以在浏览器中查看WCF服务了。但是在程序运行的时候,又出现错误。

“尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”

      因为我的机器上安装的是32位的Oracle服务器,客户端也是32位的,所以会出现这个错误。如果安装的是64位的Oracle服务器以及客户端,应该不会出现这样的问题。这样整个应用程序就是真正的64位模式运行了。

      后来想,能不能直接连接32位的Oracel服务器呢?下载一个64位的客户端,连接32位的服务器,这样整个程序也是真正的64位模式运行,只不过数据库服务器不是64位的。

      这种方式有两个问题没有解决,所以最后没有尝试。

      一是64位的客户端没有下载到,网上的链接都失效,另外由于我这网速很慢,Oracle官网登录不上去,所以就放弃了。

      二是没有测试过用64位的Oracle客户端能不能连接32位的Oracle服务器?这个问题在网上没有找到答案,也没有真正试过。

      所以最终以真正64位模式运行的计划只好放弃了。以后有时间再尝试。

64位模式:

      所谓假64位,也就是在64位机器上以32位模式运行程序,这样不管你的程序引用了没有第三方组件,都没有问题,只是要改变一下编译的方式。所有引用了第三方组件SqLite的,我们只需要引用32位的SqLite,但需要把引用这个组件的项目的编译方式改成为X86的方式进行编译。(注意,凡是引用了这个组件的其他项目,都需要以X86的模式运行)。

     在部署WCF服务的时候,为WCF选择一个应用程序池(可以使用默认的应用程序池,也可以自己新建一个应用程序池),但需要注意的是,需要把这个应用程序池的“启用32位应用程序”属性设置为True(跟上面的恰好相反)

clip_image003

这样整个应用程序就可以运行了。

AnyCpu,X86,X64编译平台的不同(纯属个人理解):

      我们知道在编译项目的时候,编译平台有三个选项,分别是AnyCpu,X86,X64,默认选择的是AnyCpu。它们三者的区别是什么呢,下面做一个简单的介绍:

      我们知道在.NET平台下面开发的应用程序,经过编译之后,变成了一种称为“IL”的中间语言(类似于Jave中的字节码),在执行的时候,通过即时编译器(JIT),再把IL转换成对应CPU可以执行的二进制代码。

      如果是以AnyCpu进行编译的话,那么程序不管部署在哪个电脑上,在运行的时候,JIT会根据你的CPU的类型来生成对应的二进制代码,32位的CPU就生成32位的二进制代码,64位的就生成64位的二进制代码。

      如果是以X86模式进行编译的话,那么程序不管部署在哪个电脑上,在运行的时候,JIT都会把IL代码转换成32位CPU执行的二进制代码。

      如果是以X64模式进行编译的话,那么程序不管部署在哪个电脑上,在运行的时候,JIT都会把IL代码转换成64位CPU执行的二进制代码。

原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2788483.html