Visual Studio 2010(付费版)为.NET程序提供了四个 objective-c PU的选择: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。但是二进制大小是怎么来的呢?
最佳答案
任何CPU都允许应用程序或库以64位进程或
32位进程,具体取决于操作系统的位数
推出。
x86应用程序将始终作为32位应用程序运行,而不管其位数如何
操作系统。
x64应用程序只能在64位操作系统上运行。这也是
有时称为AMD64,因为AMD创建了此64位指令集。
Itanium用于Itanium CPU。
如果您有一个Any CPU应用程序,并且它加载了x86库,则该应用程序
将在32位Windows下运行,但在64位Windows下将引发异常。
当您为应用程序或库指定架构时,您就是
告诉框架您的应用程序将仅与之一起使用
建筑。例如,如果您的应用程序执行特定的操作
要确保未将x86架构加载到64位中
制程或安腾制程。您可以通过设置 objective-c PU来实现。
如果您执行特定于x86架构的操作并且编译为任何CPU
您的应用程序将在32位Windows下运行,因为.NET运行时位于
32位模式。如果您的应用程序在64Bit操作系统或Itanium操作系统下运行,
运行时将查看您的应用程序,查看AnyCPU并尝试使用本机64位
码。您的应用程序将失败。如果您指定x86,则运行时将
以32位模式启动,您的应用程序将正确运行。
该设置告诉框架可以安全运行的体系结构。
实际情况是为应用程序设置了一些元数据
不一样您可以使用dumpbin.exe查看此信息。
AnyCPU库的输出
bin \ Debug> dumpbin / CLRHEADER bitnesstest.dll
Microsoft(R)COFF / PE自卸车版本10.00.30319.01
版权所有(C)Microsoft Corporation。版权所有。
转储文件bitnesstest.dll
文件类型:DLL
clr header :
48立方英尺
2.05运行时版本
2058 [MetaData目录的5D0] RVA [大小]
1个标志
仅IL
0个入口点 token
0 [0]资源目录的RVA [大小]
0 [0] StrongNameSignature目录的RVA [大小]
0 [0] CodeManagerTable目录的RVA [大小]
VTableFixups目录的0 [0] RVA [大小]
0 [0] ExportAddressTableJumps目录的RVA [大小]
0 [0] ManagedNativeHeader目录的RVA [大小]
和一个x86库
bin \ Debug> dumpbin / CLRHEADER bitnesstest.dll
Microsoft(R)COFF / PE自卸车版本10.00.30319.01
版权所有(C)Microsoft Corporation。版权所有。
转储文件bitnesstest.dll
文件类型:DLL
clr header :
48立方英尺
2.05运行时版本
2058 [MetaData目录的5D0] RVA [大小]
3个标志
仅IL
需要32位
0个入口点 token
0 [0]资源目录的RVA [大小]
0 [0] StrongNameSignature目录的RVA [大小]
0 [0] CodeManagerTable目录的RVA [大小]
VTableFixups目录的0 [0] RVA [大小]
0 [0] ExportAddressTableJumps目录的RVA [大小]
0 [0] ManagedNativeHeader目录的RVA [大小]
要显示x64和IA64-Itanium之间的区别,可以将dumpbin与
/ HEADERS开关。两者中的/ CLRHEADERS都相同,
评论。
关于.net - Visual Studio: “Target CPU”中的 “Advanced Compiler Settings”设置。它有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4216841/