Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net VisualStudio的“任何CPU”目标是什么意思?_.net_Visual Studio 2008_Build_64 Bit - Fatal编程技术网

.net VisualStudio的“任何CPU”目标是什么意思?

.net VisualStudio的“任何CPU”目标是什么意思?,.net,visual-studio-2008,build,64-bit,.net,Visual Studio 2008,Build,64 Bit,我对VisualStudio2008中的.NET平台构建选项有些困惑 什么是任何CPU编译目标,它生成什么类型的文件?我检查了这个任意CPU构建的输出可执行文件,发现它们是x86可执行文件,谁也看不到这一点!。那么,将可执行文件定位到x86与任何CPU之间有什么区别吗 我注意到的另一件事是,托管C++项目不具有这个平台作为选项。为什么呢?这是否意味着我对任何CPU可执行文件都是纯32位的怀疑是正确的?任何CPU程序集在加载到64位进程时将JIT为64位代码,在加载到32位进程时将JIT为32位代

我对VisualStudio2008中的.NET平台构建选项有些困惑

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

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

任何CPU程序集在加载到64位进程时将JIT为64位代码,在加载到32位进程时将JIT为32位代码

通过限制CPU,您可能会说:程序集正在使用某些东西—某些可能的东西 非托管的,需要32位或64位。

这里解释了不同的构建目标

根据我自己的经验,如果您希望构建一个同时在x86和x64平台上运行的项目,并且您没有任何特定的x64优化,我会将构建更改为具体的x86


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

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

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

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

dumpbin YourProgram.exe /headers
它会告诉你你的程序的比特数,还有更多的比特数。

看看这篇文章

默认设置为anyCPU,表示程序集将运行 在当前正在运行的CPU上本机运行。也就是说,它会运行 在64位机器上为64位,在32位机器上为32位。如果 程序集是从64位应用程序调用的,它将作为 64位汇编等等


上面的链接据报道已被破坏,因此这里有另一篇文章有类似的解释:

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


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

我想大部分重要的东西都已经说过了,但我只是想补充一点:如果你作为任何CPU编译并在x64平台上运行,那么你将无法加载32位DLL文件,因为你的应用程序没有在,但是那些DLL文件需要在那里运行

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

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

顺便说一句,我同意x86通常是一个更便携的选择:

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

这本书的功劳,请参见:

我推荐阅读

使用AnyCPU时,语义如下:

如果进程在32位Windows系统上运行,则它将作为32位进程运行。编译为x86机器代码。 如果进程在64位Windows系统上运行,则它将作为32位进程运行。CIL编译为x86机器代码。 如果进程在ARM Windows系统上运行,则它将作为32位进程运行。CIL编译为ARM机器代码。
那么,如何在C++ ++ C++项目中生成JIT到X64的汇编,编译到本机代码,因此JIT编译器不涉及…因此,你不能做你想做的事。来自微软的一些信息在这个链接上:嗨,安东尼,请更新你的答案w.r.t。并包含最新信息。此答案不再正确。多年来,ANYCPU的含义已经发生了几次变化。1的回答是关于C++的项目中没有任何一个问题的问题,没有任何CPU作为选择。C++ + CLI可以编译成IL代码,而不需要任何机器代码/CLR:纯。但是,sisiffOffice *仍然需要是C++中的编译时常数;所以即使没有涉及机器代码

ED,你仍然不能创建一个二进制文件,它将同时工作在32位和64位。在决定使用哪个平台目标时要考虑的一件事是:如果启动项目的目标是任何CPU,而你运行在一个64位OS上,那么在调试的同时,你就失去了编辑和继续的能力。您正在有效地调试64位进程。您可以使启动项目以x86为目标,以在调试时规避此问题。从启动项目引用的程序集可能会继续以任何CPU为目标。@现在可以使用VS2013编辑并继续的CristiDiaconescu。我认为应该注意项目是应用程序还是类库,因为为后者设置目标位可能会影响其对使用应用程序的可用性视平台而定。我遇到这种情况时,一个x86库被一个AnyCPU应用程序占用,我必须将其设置为32位以避免加载错误。如果您为服务器环境编写,并且希望您的应用程序能够使用超过2GB的内存,这可能会很糟糕。您还选择退出任何将来可能会出现的x64 JIT优化。我在任何CPU编译中遇到的大量运行时问题正是我停止将其用作构建选项所需要的理由,除非有人明确请求可以同时使用这两种编译的二进制文件。在过去的10年中,我没有任何人要求x64上的x86二进制文件。通过特别指定x86,x64操作系统将把应用程序视为纯x86应用程序,并确保一切顺利运行。-对不起,我不同意。x64操作系统仍将在WOW64中运行您的x86应用程序这对不完全了解其影响的人来说是个坏建议@奥斯汀哈利斯就是一个很好的例子。想象一下,我最近不得不在生产中处理一个仅限于几GB RAM的web worker进程。也许您可以编辑您的答案,说明如何确定给定DLL是否仅为32位。据我所知,我应该明白这一点。我想我们希望DLL也可以是任何CPU,而不仅仅是x86。这是一个重要的区别。需要使用未标识为32位的依赖项。无法找出隐藏的运行时错误消息。凭直觉改变了cpu目标,它工作了,但仍在寻找原因。总有一天,当所有的东西都是64位的时候会很好,而且不兼容的问题会像现在的16位对32位那样显得很奇怪。@GeraldDavis-我同意。具有讽刺意味的是,没有理由不能够混合32位和64位的依赖性,只是在CLR中缺少一个中继层,而我在.NET的早期感到失望。当我看到在部署时考虑到比特是一个VM/JIT时,这将是一个提供一点机会的机会。更多附加值。@mrjoltcola:更糟糕的是,微软决定将注册表项分为32位和64位,即使它们控制屏幕颜色、默认设置等。这就是我想要的答案。。。谢谢如果它内置在任何cpu中,它将在dumpbin头中显示为32位。仅当选择了Preference 32-bit时才显示。这是自Visual Studio以来的默认值11@Moerwald我相信这是一个已经修复的错误。如果您阅读了mamczas引用的内容,作者在当前VisualStudioUI中编写的“首选32位”将灰显且未选中,实际上它已启用…;在我的VS 15.8.0版本中,该选项仍然显示为灰色且未选中,但是,在编译的程序集的CorFlags部分中,它与预期的标志32BITPREF=FALSE一样工作。这是截至2018年6月9日和VS 15.8.0的最准确答案