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


494

我对Visual Studio 2008中的.NET平台生成选项有些困惑。

什么是“任何CPU”编译目标,它生成什么样的文件?我检查了此“任何CPU”构建的输出可执行文件,发现它们是x86可执行文件(谁看不到它!)。那么,将可执行文件定向到x86与“任何CPU”之间有什么区别吗?

我注意到的另一件事是,托管C ++项目没有该平台作为选项。这是为什么?这是否意味着我怀疑“任何CPU”可执行文件都是纯32位可执行文件?


4
决定使用哪个平台目标时还需要考虑的另一件事:如果启动项目的目标是Any CPU并且您正在64位OS上运行,则您将失去编辑和继续调试的能力。(您实际上是在调试64位进程)。您可以将Startup项目作为目标x86来在调试时规避此问题。(从启动项目中引用的组件可能会继续目标Any CPU
克里斯蒂安·迪亚科内斯库

8
@CristiDiaconescu现在可以使用VS2013编辑并继续
ms007 2013年

我认为这里应该对项目是应用程序还是类库进行一些说明,因为为后者设置目标位数可能会影响平台对消费应用程序的可用性。我遇到了一个x86库,该库被AnyCPU应用程序占用,在该应用程序中必须设置该库Prefer 32-bit以避免加载错误。
SteveCinq

Answers:


384

一个AnyCPU当被加载到64位的处理,并且当被加载到32位进程32钻头组件将JIT到64位的代码。

通过限制CPU,您可能会说:程序集使用的某些内容(可能是不受管理的内容)需要32位或64位。


3
那么,如何在C ++中生成将JIT转换为x64的程序集?
galets

50
C ++项目可编译为本机代码,因此不涉及JIT编译器...因此,您无法执行所要求的操作。
cplotts 2010年

7
@cplotts:由于@galets在3个月前问了这个问题,他不太可能看到您的答案。在您的评论中使用@galets前缀,类似于我在此处的用法,以便他收到有关您答案的警报。
AnthonyWJones

4
@AnthonyWJones通常,您是对的,除非用户是问题的操作者(在这种情况下),因为他们将收到所有评论的通知。
马克·赫德

12
@MarkHurd实际上,在这种情况下,OP将不会得到通知。除非明确使用@语法 OP进行注释否则OP不会收到有关注释的通知。OP只会自动收到添加到其原始问题的评论的通知。
RSW

320

我认为已经讲了大多数重要的内容,但是我只是想补充一件事:如果您以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
也许您可以编辑答案以说出如何确定给定的DLL是否仅为32位。据我所知,应该可以解决。我认为我们希望DLL也是“任何CPU”,而不只是x86。
Dan W

+1重要区别。需要使用32位依赖项(尚未这样确定)。无法找出神秘的运行时错误消息。凭直觉改变了cpu的目标,它起作用了,但是却去寻找“为什么”。总有一天,当所有东西都是64位并且不兼容的问题看起来像16bit vs 32bit那样古朴,这将是美好的。
杰拉尔德·戴维斯

2
@GeraldDavis-我同意。具有讽刺意味的是,没有技术原因无法混合使用32位和64位依赖项(只是CLR中缺少thunk层),当我看到.NET时,我对.NET感到很失望。部署时仍然需要考虑其他因素(考虑到这是VM / JIT,这将是提供更多附加值的机会)。
codenheim 2014年

1
@mrjoltcola:甚至比微软更糟糕的是,我决定我不能理解注册表项应该拆分为32位和64位Universe的方式,即使它们控制诸如屏幕颜色,默认设置等。
超级猫

这就是我一直在寻找的答案...谢谢!
Daminion Software的Murat 2014年

51

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

根据我自己的经验,如果您希望构建一个可以在x86和x64平台上运行的项目,并且没有任何特定的x64优化,我会将该构建更改为专门说“ x86”。

这样做的原因有时是您可能会遇到一些DLL文件冲突或某些代码,这些代码最终会在x64环境中崩溃导致WOW崩溃。通过专门指定x86,x64 OS会将应用程序视为纯x86应用程序,并确保一切运行顺利。


37
如果您在服务器环境中撰写文章并希望您的应用程序能够使用超过2GB的内存,那可能会很糟糕。您还选择了有朝一日可能无法完成的任何x64 JIT优化。
奥斯汀·哈里斯

我对AnyCPU编译所遇到的运行时问题的数量,是我停止使用它作为构建选项所需要的全部理由,除非有人明确要求在两者上都可以使用的二进制文件。在过去的十年中,我还没有人要求x64上的x86二进制文件。
kayleeFrye_onDeck

2
“通过专门指定x86,x64操作系统将把该应用程序视为纯x86应用程序,并确保一切正常运行。” -对不起,我不同意。x64 OS仍将在WOW64中运行您的x86应用程序
Mandeep Janjua

对于那些不完全了解其影响的人来说,这只是个坏建议。@AustinHarris就是一个很好的例子。想象一下,一个Web worker进程仅限于几个GB的RAM(我最近在生产中不得不处理这个问题)。
rgoliveira

47

查看文章Visual Studio .NET平台目标说明

默认设置为“任何CPU”,表示该程序集将在其当前运行的CPU上本地运行。这意味着它将在64位计算机上以64位运行,在32位计算机上以32位运行。如果从64位应用程序调用该程序集,则它将作为64位程序集执行,依此类推。

据报道,以上链接已断开,因此这是另一篇文章,具有类似的解释:.NET 4.5和Visual Studio 11中AnyCPU的真正含义


1
链接已断开-立即转到托管域。
乔恩·亚当斯

我添加了第二篇文章的链接,其中包含类似信息。万一该域被重新激活,我离开了第一个链接。
DCNYAM '17


39

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

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

只要您怀疑,就可以转到Visual Studio 2008命令行并运行以下命令。

dumpbin YourProgram.exe /headers

它会告诉您程序的细节,以及更多。


7
如果内置于“ any cpu”中,则它将在dumpbin标头中显示为32bit。
Kirbinator

34

任何CPU都意味着它将可以在任何平台上运行。这是因为托管代码类似于Java。可以将其视为已编译为.NET Framework在运行时解释的字节码。

C ++没有此选项,因为它被编译为平台特定的机器代码。


12
+1用于回答其他人没有做过的问题的一部分(关于没有将AnyCPU作为选项的C ++项目)。
cplotts 2010年

可以将C ++ / CLI编译为IL代码,而无需任何机器代码(/ clr:pure)。但是sizeof(void *)仍然需要在C ++中是一个编译时常量。因此,即使不涉及任何机器代码,您仍然无法创建可同时在32位和64位上运行的二进制文件。
丹尼尔

5

我建议阅读这篇文章

使用AnyCPU时,语义如下:

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

8
仅当选择“首选32位”时。
Florian

自Visual Studio 11
Moerwald '18

@Moerwald我相信这是一个已修复的错误。如果您阅读mamczas所引用的 文章,那么作者将写道:“在当前的Visual Studio UI中,“首选32位”显示为灰色且未选中,实际上是启用的……”;在我的VS(15.8.0)版本中,该选项仍然显示为灰色且未选中,但是,它可以按预期工作(编译后的汇编的CorFlags部分中的标志32BITPREF = FALSE)
Raikol Amaro

-1

这是我在Visual Studio 2017中做到的:

  • 在解决方案资源管理器中
  • 右键点击您的项目
  • 点击“属性”
  • 点击“构建”
  • 关闭选项“首选32位”
  • 您可以从“平台”目标中选择“ x64”。

这个答案是题外话。
乔纳斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.