Visual Studio "Any CPU"目标的意思吗?

我对Visual Studio 2008中的. net平台构建选项有些困惑。

“Any CPU”编译目标是什么,它生成什么类型的文件?我检查了这个“任意CPU”构建的输出可执行文件,发现它们是x86可执行文件(谁也没想到!)那么,针对可执行文件到x86和针对可执行文件到x86之间有什么区别吗?“任何CPU”?

我注意到的另一件事是,托管c++项目没有这个平台作为一个选项。为什么呢?这是否意味着我对“任何CPU”可执行文件是普通32位的怀疑是正确的?

258345 次浏览

AnyCPU程序集在加载到64位进程时将JIT为64位代码,在加载到32位进程时将JIT为32位代码。

通过限制CPU,你会说:有一些东西正在被程序集使用(一些可能的东西) 非托管),需要32位或64位。

这里是快速概述,它解释了不同的构建目标。

根据我自己的经验,如果您正在构建一个在x86和x64平台上运行的项目,而您没有任何特定的x64优化,我会将构建更改为专门表示“x86”。

这样做的原因是,有时您可能会得到一些DLL文件发生碰撞,或者一些代码在x64环境中导致崩溃。通过特别指定x86, x64操作系统将把应用程序视为纯x86应用程序,并确保一切顺利运行。

“任意CPU”意味着当程序启动时,. net框架会根据操作系统的比特数判断程序是运行在32位还是64位。

x86任何CPU之间有一个区别:在x64系统上,为X86编译的可执行文件将作为32位可执行文件运行。

根据您的怀疑,只需转到visualstudio2008命令行并运行以下命令。

dumpbin YourProgram.exe /headers

它会告诉你程序的大小,还有很多其他信息。

查看文章Visual Studio .NET平台目标解释 .NET平台目标解释

默认设置,“任意cpu”,意味着程序集将运行 本机位于当前运行的CPU上。也就是说,它会运行 在64位机器上是64位,在32位机器上是32位。如果 程序集从64位应用程序调用时,它将作为

上面的链接已经被报告断开了,所以这里有另一篇文章有类似的解释: AnyCPU的真正含义是。net 4.5和Visual Studio 11

任何CPU都意味着它可以在任何平台上工作。这是因为托管代码类似于Java。可以把它看作是被编译成字节码,由. net Framework在运行时解释。

c++没有这个选项,因为它被编译为特定于平台的机器代码。

我认为大多数重要的东西已经说过了,但我只是想补充一件事:如果你编译为任何CPU并在x64平台上运行,那么你将无法加载32位DLL文件,因为你的应用程序不是在WoW64中启动的,但这些DLL文件需要在那里运行。

如果您编译为x86,那么x64系统将在WoW64中运行您的应用程序,并且您将能够加载32位DLL文件。

所以我认为如果你的依赖可以在任何一个环境中运行,你应该选择“任何CPU”,但如果你有32位依赖,就选择x86。微软的这篇文章对此做了一些解释:

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

顺便说一句,这是另一个微软文档同意x86通常是一个更可移植的选择:

对于应用程序包来说,选择x86通常是最安全的配置 因为它几乎可以在所有设备上运行。在某些设备上,应用程序 x86配置的软件包将无法运行,例如Xbox或其他 物联网核心设备。然而,对于PC来说,x86包是最安全的 选择,并具有最大的设备部署范围。一个实质性的 部分Windows 10设备继续运行x86版本 窗户。< / p >

感谢"CLR via c# "这本书,看看这个:

Enter image description here

我推荐阅读这篇文章

当使用AnyCPU时,语义如下:

  • 如果该进程运行在32位Windows系统上,则它作为32位进程运行。CIL被编译为x86机器码。
  • 如果该进程运行在64位Windows系统上,则它作为32位进程运行。CIL被编译为x86机器代码。
  • 如果该进程运行在ARM Windows系统上,则它作为32位进程运行。CIL被编译成ARM机器代码。