我有一个似乎总是针对x86 / 32位的项目,我找不到原因。我已经完成了解决方案中的所有项目,并确保PlatformTarget是AnyCPU。
使用dumpbin检查我得到的所有二进制文件'14C machine(x86)'。
构建机器是x64,虽然以前是x86。
还有什么可能导致这种情况以及我应该检查什么?
答案 0 :(得分:4)
您必须使用/ headers选项谈论从Dumpbin.exe中看到的输出。在使用设置为AnyCPU的平台目标编译的.NET程序集上运行时看起来像这样:
Dump of file ConsoleApplication1.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
3 number of sections
4E3E987F time date stamp Sun Aug 07 08:51:59 2011
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
etc..
是的,IMAGE_FILE_HEADER.Machine值设置为0x14c,即IMAGE_FILE_MACHINE_I386(又名x86)的值。这没有任何意义,也许与目标名称无关的最强暗示是:AnyCPU。它在x86和x64操作系统上一样运行。
你真正想要使用的是corflags.exe,它会在文件中显示COR头:
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 1
ILONLY : 1
32BIT : 0
Signed : 0
32BIT标志是重要的标志,0表示使用了AnyCPU。 ILONLY = 1表示程序集仅包含IL,没有机器代码。使用C ++ / CLI语言创建程序集时,它将为0。
您可以创建一个图像文件,并将机器设置为x64。我认为这是在.NET 3.0(又名.NET 2.0 SP1)中引入的。如果将平台目标设置为x64,则机器类型字段将设置为IMAGE_FILE_MACHINE_AMD64(aka x64)。除了程序将永远不会在32位操作系统上运行并且主线程将以4兆字节堆栈而不是1 MB堆栈启动时,这并没有多大区别。
this answer中描述了将32位可执行映像转换为64位进程的魔力。