当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《VisualStudio"任何CPU"目标是什么意思?》经验,为你挑选了8个好方法。

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

什么是"任何CPU"编译目标,它生成什么类型​​的文件?我检查了这个"Any CPU"构建的输出可执行文件,发现它们是x86可执行文件(谁也看不到它!).那么,将可执行文件定位到x86与"任何CPU"之间有什么区别吗?

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



1> AnthonyWJone..:

一个AnyCPU当当被加载到32位进程加载到64个进程和32位汇编将JIT到64位的代码.

通过限制CPU,您会说:组件使用的东西(可能是非托管的)需要32位或64位.


C++项目编译为本机代码,因此不涉及JIT编译器......因此,您不能按照您的要求进行操作.
@MarkHurd实际上,在这种情况下,OP不会得到通知.除非特别用@语法编写,否则OP不会收到评论*的回复*.OP只会自动收到添加到原始问题的评论的通知.
@cplotts:自从@galets 3个月前提出这个问题后,他不太可能看到你的回答.在评论中使用@galets前缀,与我在此处的方式类似,以便他获得有关您答案的提醒.
@AnthonyWJones一般来说,你是正确的,除非用户是问题的OP,因为在这种情况下,他们会得到所有评论的通知.
那么,如何在C++中生成JIT到x64的汇编?
这个答案不再正确.多年来,AnyCPU的含义已多次改变.

2> Paul A Jungw..:

我想大多数重要的东西已经说过了,但我只是想添加一件事:如果你编译为任何CPU并在x64平台上运行,那么你将无法加载32位dll,因为你的应用程序没有在WOW64中启动,但那些dll需要在那里运行.
如果你编译为x86,那么x64系统将在WOW64中运行你的应用程序,你将能够加载32位dll.
因此,如果您的依赖项可以在任一环境中运行,我认为您应该选择"任何CPU",但如果您具有32位依赖项,则选择x86.微软的这篇文章解释了这一点:

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

顺便提一下,这个其他Microsoft文档同意x86通常是一个更便携的选择:

选择x86通常是应用程序包的最安全配置,因为它几乎可以在每个设备上运行.在某些设备上,不会运行具有x86配置的应用程序包,例如Xbox或某些IoT核心设备.但是,对于PC,x86软件包是最安全的选择,并且具有最大的设备部署范围.Windows 10设备的很大一部分继续运行x86版本的Windows.


也许您可以编辑您的答案,说明如何确定给定的DLL是否仅为32位.据我所知,[这个](http://stackoverflow.com/a/2418287/848344)应该明白这一点.我想我们希望DLL也是"任何CPU",而不仅仅是x86.
@GeraldDavis - 我同意.具有讽刺意味的是,没有技术上的原因导致无法混合32位和64位的依赖关系(只是CLR中缺少一个thunking层)而且我在早期的.NET中感到很失望,当时我看到了在部署时还需要考虑一下(考虑到这是VM/JIT,它本来是一个提供更多附加价值的机会).

3> Dillie-O..:

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

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

原因有时你可能会得到一些碰撞的DLL或一些在x64环境中崩溃WOW的代码.通过专门指定x86,x64操作系统将把应用程序视为纯x86应用程序,并确保一切顺利运行.


如果您为服务器环境编写并希望您的应用程序能够使用超过2GB的内存,这可能会很糟糕.您也选择退出可能有一天会进入管道的任何x64 JIT优化.

4> DCNYAM..:

查看文章Visual Studio .NET Platform Target Explained.

默认设置"Any CPU"表示程序集将在当前运行的CPU上本机运行.这意味着,它将在64位计算机上以64位运行,在32位计算机上以32位运行.如果从64位应用程序调用程序集,它将作为64位程序集执行,依此类推.

据报道上面的链接被破坏了,所以这里有另一篇文章,其中有类似的解释:AnyCPU在.NET 4.5和Visual Studio 11中的含义是什么



5> AngryHacker..:

"任何CPU"意味着当程序启动时,.NET Framework将根据OS位数确定是以32位还是64位运行程序.

x86任何CPU之间存在差异:在x64系统上,为X86编译的可执行文件将作为32位可执行文件运行.

至于您的怀疑,只需转到Visual Studio 2008命令行并运行以下命令.

dumpbin YourProgram.exe /headers

它会告诉你程序的位数,还有更多.


如果它是在"任何cpu"中构建的,它将在dumpbin头中显示为32位.

6> Ivan..:

相信预订"通过C#CLR",请看:

https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38

在此输入图像描述


这是截至2018年9月6日和VS 15.8.0的最准确答案

7> Adam Tegen..:

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

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


+1用于回答其他人没有做过的问题的一部分(关于C++项目没有选择AnyCPU).

8> 小智..:

我建议阅读这篇文章。

使用AnyCPU时,语义如下:

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

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

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


仅当选择“首选32位”时。
推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有