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.但二进制大小是如何进入的?
任何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对于两者都是相同的,如评论中所述.
| 归档时间: |
|
| 查看次数: |
6951 次 |
| 最近记录: |