.net Visual Studio的“Any CPU”目标是什么意思?

yqkkidmi  于 2023-05-08  发布在  .NET
关注(0)|答案(8)|浏览(342)

我对Visual Studio 2008中的.NET平台构建选项有一些困惑。
什么是“Any CPU”编译目标,它生成什么类型的文件?我检查了这个“Any CPU”构建的输出可执行文件,发现它们是x86可执行文件(谁会没有看到这一点呢!)。那么,将可执行文件定位到x86与“任何CPU”
我注意到的另一件事是,托管C++项目没有这个平台作为一个选项。为什么会这样呢?这是否意味着我对“任何CPU”可执行文件都是普通32位可执行文件的怀疑是正确的?

nbnkbykc

nbnkbykc1#

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

通过限制CPU,你会说:* 程序集正在使用需要32位或64位的内容(可能是非托管内容)。*

f0brbegy

f0brbegy2#

我想大部分重要的东西都已经说过了,但我想我应该补充一点:如果您编译为Any CPU并在x64平台上运行,那么您将无法加载32位DLL文件,因为您的应用程序不是在WoW64中启动的,但这些DLL文件需要在那里运行。
如果您编译为x86,那么x64系统将在WoW64中运行您的应用程序,并且您将能够加载32位DLL文件。
所以我认为如果你的依赖可以在任何一个环境中运行,你应该选择“任何CPU”,但是如果你有32位的依赖,选择x86。微软的这篇文章对此做了一些解释:
/CLRIMAGETYPE (Specify Type of CLR Image)
顺便说一句,微软的其他文档也认为x86通常是一个更便携的选择:
选择x86通常是应用程序包最安全的配置,因为它几乎可以在所有设备上运行。在某些设备上,具有x86配置的应用程序包将无法运行,例如Xbox或某些IoT Core设备。但是,对于PC,x86封装是最安全的选择,并且具有最大的设备部署范围。相当一部分Windows 10设备继续运行x86版本的Windows。

dpiehjr4

dpiehjr43#

这本书的作者 "CLR via C#",请看:

8oomwypt

8oomwypt4#

下面的a quick overview解释了不同的构建目标。
根据我自己的经验,如果您希望构建一个同时在x86和x64平台上运行的项目,并且您没有任何特定的x64优化,我会将构建版本更改为专门的“x86”。
这是因为有时您可能会得到一些冲突的DLL文件或一些在x64环境中导致WoW崩溃的代码。通过特别指定x86,x64操作系统将把应用程序视为纯x86应用程序,并确保一切顺利运行。

kcrjzv8t

kcrjzv8t5#

查看文章 Visual Studio .NET Platform Target Explained
默认设置“任何CPU”意味着程序集将在当前运行它的CPU上本机运行。这意味着,它将在64位机器上以64位运行,在32位机器上以32位运行。如果从64位应用程序调用程序集,则它将作为64位程序集执行,依此类推。
上面的链接已经被报道被打破了,所以这里有另一篇文章,有类似的解释:What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

nimxete2

nimxete26#

“任何CPU”意味着当程序启动时,.NET Framework将根据操作系统的位数确定是以32位还是64位运行程序。

  • x86* 和 Any CPU 之间有区别:在x64系统上,为X86编译的可执行文件将作为32位可执行文件运行。

至于你的怀疑,只要转到Visual Studio 2008命令行并运行以下命令即可。

dumpbin YourProgram.exe /headers

它会告诉你你的程序的位数,以及更多。

blpfk2vs

blpfk2vs7#

任何CPU意味着它可以在任何平台上工作。这是因为托管代码类似于Java。可以将其视为编译为字节码,由. NETFramework在运行时解释。
C++没有此选项,因为它被编译为特定于平台的机器码。

inkz8wg9

inkz8wg98#

我推荐阅读this post
当使用 AnyCPU 时,语义如下:

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

相关问题