Visual Studio:“高级编译器设置”中的“目标CPU”设置。它有什么作用?

时间:2010-11-18 16:02:04

标签: .net visual-studio

Visual Studio 2010(付费版)为.NET程序提供了四种目标CPU:AnyCPU,x86,x64和Itanium。

这些设置究竟做了什么?

我注意到(在x64 Windows 7计算机上),使用AnyCPU和x86创建的二进制文件具有相同的大小,使用x64或Itanium创建的二进制文件具有相同的大小(但小于第一个)。为x86创建的二进制文件似乎也在WoW64中运行,而为AnyCPU编译的相同大小的二进制文件则不会。针对Itanium优化的二进制文件在Windows 7 x64上根本不运行(这是有意义的)。

我假设Windows在本机模式下运行AnyCPU二进制文件(在我的情况下为x64),并在64位计算机(x64和Itanium)上的WoW64中运行x86。但二进制大小是如何进入的?

4 个答案:

答案 0 :(得分:7)

任何CPU都允许应用程序或库作为64位进程运行或运行 32位进程,取决于进程的操作系统的位数 推出。

x86应用程序将始终以32位应用程序运行,而不管其位数如何 操作系统。

x64应用程序只能在64位操作系统上运行。这也是 有时称为AMD64,因为AMD创建了这个64位指令集。

Itanium适用于Itanium CPU。

如果你有一个Any CPU应用程序,它会加载一个x86库应用程序 将在32位Windows下工作,但会在64位Windows下抛出异常。

当您为应用程序或库指定体系结构时 告诉框架你的应用程序只能使用它 建筑。例如,如果您的应用程序执行特定的操作 到x86架构,你要确保它没有加载到64位 进程或Itanium进程。您可以通过设置目标CPU来完成此操作。

如果您执行特定于x86体系结构的某些操作并编译为任何CPU 您的应用程序将在.NET运行时所在的32位窗口下运行 32位模式。如果您的应用程序是在64Bit操作系统或Itanium操作系统下运行的 运行时将查看您的应用程序看到AnyCPU并尝试使用本机64位 码。您的应用程序将失败。如果你指定x86那么运行时将 以32位模式启动,您的应用程序将正常运行。

该设置告诉框架哪些架构可以安全运行。

实际发生的是设置了一些应用程序的元数据 不同。你可以用dumpbin.exe看到这个信息。这是一个例子 AnyCPU库的输出

bin\Debug>dumpbin /CLRHEADER bitnesstest.dll
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file bitnesstest.dll

File Type: DLL

  clr Header:

              48 cb
            2.05 runtime version
            2058 [     5D0] RVA [size] of MetaData Directory
               1 flags
                   IL Only
               0 entry point token
               0 [       0] RVA [size] of Resources Directory
               0 [       0] RVA [size] of StrongNameSignature Directory
               0 [       0] RVA [size] of CodeManagerTable Directory
               0 [       0] RVA [size] of VTableFixups Directory
               0 [       0] RVA [size] of ExportAddressTableJumps Directory
               0 [       0] RVA [size] of ManagedNativeHeader Directory

和x86库

bin\Debug>dumpbin /CLRHEADER bitnesstest.dll
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file bitnesstest.dll

File Type: DLL

  clr Header:

              48 cb
            2.05 runtime version
            2058 [     5D0] RVA [size] of MetaData Directory
               3 flags
                   IL Only
                   32-Bit Required
               0 entry point token
               0 [       0] RVA [size] of Resources Directory
               0 [       0] RVA [size] of StrongNameSignature Directory
               0 [       0] RVA [size] of CodeManagerTable Directory
               0 [       0] RVA [size] of VTableFixups Directory
               0 [       0] RVA [size] of ExportAddressTableJumps Directory
               0 [       0] RVA [size] of ManagedNativeHeader Directory

要显示x64和IA64之间的区别 - Itanium可以使用dumpbin / HEADERS开关。 / CLRHEADERS对于两者都是相同的 评价。

答案 1 :(得分:1)

来自MSDN

  

目标CPU(C#中的平台目标)项目属性指定编译器是否应针对特定CPU类型(例如,64位处理器)优化编译。您可以将目标平台设置为所有CPU类型或特定CPU类型的x86,x64或Itanium。默认情况下,此选项设置为AnyCPU(C#中的任何CPU),它指定编译器不应针对特定CPU类型优化编译。

答案 2 :(得分:0)

AnyCPU导致JIT在机器的体系结构中运行代码被JIT打开的代码。

将其设置为任何特定的体系结构将使其构建为仅由特定体系结构中的JIT运行。

为什么在64位计算机上任何CPU都不能在WOW64下运行,这是因为那是用于x86二进制文件的地方,你的x64被执行。

答案 3 :(得分:0)

BTW,更改CPU选项还会将已编译代码的调试/发布版本的默认位置从path \ bin \ debug更改为path \ bin \ x86 \ debug等。您可能希望删除路径\ bin \ debug和path \ bin \ release目录,以防止意外地抓取真正旧版本的应用程序。