如何理解.NET开发中的x86/x64/AnyCPU

 

在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。当然特殊的部署环境还要特殊考虑。


未能加载文件或程序集”xxxx”或它的某一个依赖项,试图加载格式不正确的程序。

那么下次遇到上面这个错误时,就要好好检查下是不是项目的目标平台设置不对了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值