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

在VisualStudio中项目平台属性包含x86/x64/AnyCPU三个选项,之前的项目中并没有特别去关注这一点,最近的项目中涉及到了在不同平台运行的问题,所以专门了解并整理了这方面的知识。

x86/x64/AnyCPU的含义
在vs中这一选项被称为“目标平台”,也就是编译成功的项目最终是要在什么平台上运行。 


编译(目标)平台    含义
x86    将程序集编译为由兼容 x86 的 32 位公共语言运行库运行;
x64    将程序集编译为由支持 AMD64 或 EM64T 指令集的计算机上的 64 位公共语言运行库运行;
AnyCPU    (默认值)将程序集编译为在任意平台上运行。
x86/x64/AnyCPU的区别
我们使用.NET平台开发程序所构造的项目被称为“程序集”,程序集的输出类型有Windows应用程序、控制台应用程序、类库。使用频率较高的是Windows应用程序和类库。Windows应用程序一般包括我们常见的WinForm、WPF程序,文件格式通常为可执行文件(.exe);类库一般是WEB程序或动态链接库,文件格式通常为.dll。 
关于x86/x64/AnyCPU之间的区别,我们就看一看exe和dll两类文件在不同平台的操作系统上运行的结果。

x86操作系统
目标平台    程序类型    运行结果
x86    应用程序exe    在32位CLR上运行
x86    类库dll    在32位CLR上运行
x64    应用程序exe    无法运行
x64    类库dll    无法运行
AnyCPU    应用程序exe    在32位CLR上运行
AnyCPU    类库dll    在32位CLR上运行
x64操作系统
目标平台    程序类型    运行结果
x86    应用程序exe    在WOW下的32位CLR上运行
x86    类库dll    在WOW下的32位CLR上运行
x64    应用程序exe    在64位CLR上运行
x64    类库dll    在64位CLR上运行
AnyCPU    应用程序exe    在64为CLR上运行
AnyCPU    类库dll    在与加载它的进程相同的CLR上运行
从上面的运行结果来看我们可以基本确定一个结论:

主程序和其引用的类库在运行时的平台应该保持一致。

不过这样理解起来还是有些问题,我们举几个例子: 
1. AnyCPU的应用程序+AnyCPU的类库 
在x86的操作系统上,应用程序会在32位CLR上运行,所以它引用的类库也会在32位CLR上运行; 
在x64操作系统上,应用程序许会在64位CLR上运行,所以它引用的类库也会在64为CLR上运行。 
2. x86的应用程序+AnyCPU的类库 
在x86的操作系统上,应用程序会在32位CLR上运行,它引用的类库也会在32位CLR上运行; 
在x64的操作系统上,应用程序会在WOW下的32位CLR上运行,它引用的类库也会在WOW下的332位CLR上运行。 
3. x64的应用程序+AnyCPU的类库 
在x86的操作系统上,应用程序无法运行,更不要说引用类库了; 
在x64的操作系统上,应用程序会在64位CLR上运行,引用的类库也会在64位CLR上运行。 
4. AnyCPU的应用程序+x64的类库 
在x86的操作系统上,应用程序会在32位CLR上运行,但引用的类库无法在32为CLR上运行,程序报错; 
在x64的操作系统上,应用程序会在64位CLR上运行,引用的类库也会在64位CLR上运行。 
5. AnyCPU的应用程序+x86的类库 
在x86的操作系统上,应用程序会在32位CLR上运行,引用的类库也会在32位CLR上运行; 
在x64的操作系统上,应用程序会在64位CLR上运行,但引用的类库无法在64位CLR上运行。

有了以上的例子,是不是有点明白了?当然我们的主程序并不限于应用程序exe,不要忘了常见的Web应用的主程序就是类库,不过原理还是一样的:主程序和引用类库在运行时的平台要保持一致。

一般来讲,我们可以把主程序的目标平台根据实际需求设置为跟部署的操作系统一致,类库最好是AnyCPU。当然特殊的部署环境还要特殊考虑。
--------------------- 
作者:ludewig 
来源:CSDN 
原文:https://blog.csdn.net/lordwish/article/details/52312015 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/u011555996/article/details/83863632