我对Visual Studio 2008中的.NET平台生成选项有些困惑。
什么是“任何CPU”编译目标,它生成什么样的文件? 我检查了此“任何CPU”构建的输出可执行文件,发现它们是x86可执行文件(谁看不到它!)。 那么,将可执行文件定向到x86与“任何CPU”之间有什么区别吗?
我注意到的另一件事是,托管C ++项目没有该平台作为选项。 这是为什么? 这是否意味着我怀疑“任何CPU”可执行文件都是纯32位可执行文件?
#1楼
我认为已经讲了大多数重要的内容,但我只是想补充一件事:如果您以Any CPU的身份进行编译并在x64平台上运行,那么您将无法加载32位DLL文件,因为您的应用程序不是在WoW64中启动的,但是那些DLL文件需要在其中运行。
如果编译为x86,则x64系统将在WoW64中运行您的应用程序,并且您将能够加载32位DLL文件。
因此,我认为如果依赖项可以在两种环境中运行,则应该选择“任何CPU”,但是如果您具有32位依赖项,则应该选择x86。 Microsoft的这篇文章对此做了一些解释:
顺便提及, 其他Microsoft文档也同意x86通常是更可移植的选择:
选择x86通常是应用程序包最安全的配置,因为它几乎可以在所有设备上运行。 在某些设备上,具有x86配置的应用程序包将无法运行,例如Xbox或某些IoT Core设备。 但是,对于PC而言,x86软件包是最安全的选择,并且对设备部署的影响最大。 Windows 10设备的很大一部分继续运行Windows的x86版本。
#2楼
归功于《通过C#进行CLR》一书,请参见:
#3楼
我建议阅读这篇文章 。
使用AnyCPU时 ,语义如下:
- 如果该进程在32位Windows系统上运行,则它将作为32位进程运行。 CIL被编译为x86机器代码。
- 如果该进程在64位Windows系统上运行,则它将作为32位进程运行。 CIL被编译为x86机器代码。
- 如果该进程在ARM Windows系统上运行,则它将作为32位进程运行。 CIL被编译为ARM机器代码。
#4楼
AnyCPU程序集在加载到64位进程中时将JIT转换为64位代码,而在加载到32位进程中时将转换为32位代码。
通过限制CPU,您会说: 程序集使用的某些内容(可能是不受管理的)需要32位或64位。
#5楼
这是一个快速概述 ,解释了不同的构建目标。
根据我自己的经验,如果您希望构建一个可以在x86和x64平台上运行的项目,并且没有任何特定的x64优化,那么我会将该构建更改为专门说“ x86”。
这样做的原因有时是您可能会遇到一些DLL文件冲突或某些代码,这些代码最终会在x64环境中崩溃导致WOW崩溃。 通过专门指定x86,x64 OS会将应用程序视为纯x86应用程序,并确保一切运行顺利。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3160132