Visual Studio“任何CPU”目标是什么意思?

浪子不回头ぞ 提交于 2020-02-27 02:09:55

我对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的这篇文章对此做了一些解释:

/ CLRIMAGETYPE(指定CLR图像的类型)

顺便提及, 其他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应用程序,并确保一切运行顺利。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!