Visual Studio“任何CPU”目标是什么意思?
我有一些与Visual Studio 2008中的.NET平台构build选项有关的困惑。
什么是“任何CPU”编译目标,它生成什么样的文件? 我检查了这个“任何CPU”构build的输出可执行文件,发现它们是x86可执行文件(谁也不会看到!)。 那么,将可执行文件定位到x86与“任何CPU”之间有什么区别吗?
我注意到的另一件事是托pipe的C ++项目没有这个平台作为选项。 这是为什么? 这是否意味着我怀疑“任何CPU”的可执行文件是纯32位的是正确的?
一个AnyCPU程序集将在加载到64位进程时将64位代码JIT加载到32位进程中。
通过限制CPU你会说: 有一些正在使用的程序集(可能是非pipe理的东西),需要32位或64位。
我认为大部分重要的东西已经说过了,但我只是想加一件东西
如果您编译为任何CPU并在x64平台上运行,那么您将无法加载32位dll,因为您的应用程序未在WOW64中启动,但这些dll需要在那里运行。
如果您编译为x86,则x64系统将在WOW64中运行您的应用程序,并且您将能够加载32位dll。
所以我认为如果你的依赖可以在任何一个环境中运行,你应该select“任何CPU”,但是如果你有32位依赖,selectx86。 微软的这篇文章解释了这一点:
/ CLRIMAGETYPE(指定CLR图像的types)
这里有一个快速的概述 ,解释了不同的构build目标。
从我自己的经验来看,如果您打算构build一个可以在x86和x64应用程序上运行的项目,并且您没有任何特定的x64优化,那么我会更改构build以专门说“x86”。
这样做的原因有时你可能会碰到一些碰撞的DLL或者一些在x64环境中崩溃的代码。 通过专门指定x86,x64操作系统将把应用程序视为一个纯粹的x86应用程序,并确保一切运行顺利。
查看Visual Studio .NET平台目标解释文章 。
默认设置“任何CPU”意味着程序集将在当前运行的CPU上本地运行。 这意味着,它将在64位机器上以64位运行,在32位机器上以32位运行。 如果程序集是从64位应用程序调用的,则它将以64位程序集的forms运行,等等。
“任何CPU”意味着程序启动时,.NET Framework将根据操作系统位数计算出是否以32位或64位运行程序。
x86和Any CPU之间有区别:在x64系统上,为X86编译的可执行文件将作为32位可执行文件运行。
至于你的怀疑,只要转到Visual Studio 2008命令行并运行以下。
dumpbin YourProgram.exe /headers
它会告诉你的程序的位,再加上更多。
任何CPU意味着它可以在任何平台上工作。 这是因为托pipe代码与Java相似。 可以把它看作是被编译成一个由.NET Framework在运行时解释的字节码。
C ++没有这个选项,因为它被编译为特定于平台的机器代码。
我build议阅读这篇文章。
在使用AnyCPU时,语义如下:
- 如果进程在32位Windows系统上运行,则它以32位进程运行。 IL被编译为x86机器码。
- 如果进程在64位Windows系统上运行,则它以32位进程运行。 IL被编译为x86机器码。
- 如果进程在ARM Windows系统上运行,则它以32位进程运行。 IL被编译为ARM机器码。