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

And*_*ehm 2 .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.但二进制大小是如何进入的?

Dar*_*ten 7

任何CPU都允许应用程序或库作为64位进程或32位进程运行,具体取决于启动进程的操作系统的位数.

无论操作系统的位数如何,x86应用程序将始终作为32位应用程序运行.

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

Itanium用于Itanium CPU.

如果您有一个任何CPU应用程序并且它加载了一个x86库,该应用程序将在32位Windows下运行,但会在64位Windows下引发异常.

当您为应用程序或库指定体系结构时,您告诉框架您的应用程序将仅适用于该体系结构.例如,如果您的应用程序执行特定于x86体系结构的操作,则需要确保它不会加载到64位进程或Itanium进程中.您可以通过设置目标CPU来完成此操作.

如果您执行特定于x86体系结构的某些操作并编译为任何CPU,则应用程序将在32位窗口下运行,因为.NET运行时将处于32位模式.如果您的应用程序在64位操作系统或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对于两者都是相同的,如评论中所述.