.net VS 2010项目始终以x86/32位为目标

.net VS 2010项目始终以x86/32位为目标,.net,visual-studio-2010,.net,Visual Studio 2010,我有一个项目似乎总是以x86/32位为目标,我不知道为什么。我已经完成了解决方案中的所有项目,并确保平台目标是AnyCPU 使用dumpbin检查我得到的所有二进制文件“14C机器(x86)” 生成计算机是x64,尽管以前是x86 还有什么可能导致这种情况,我应该检查什么?您一定是在谈论使用/headers选项从Dumpbin.exe看到的输出。在编译平台目标设置为AnyCPU的.NET程序集上运行时,如下所示: Dump of file ConsoleApplication1.exe PE

我有一个项目似乎总是以x86/32位为目标,我不知道为什么。我已经完成了解决方案中的所有项目,并确保平台目标是AnyCPU

使用dumpbin检查我得到的所有二进制文件“14C机器(x86)”

生成计算机是x64,尽管以前是x86


还有什么可能导致这种情况,我应该检查什么?

您一定是在谈论使用/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
32位标志很重要,0表示使用了任何CPU。ILONLY=1表示程序集仅包含IL,不包含机器代码。使用C++/CLI语言创建程序集时,它将为0

您可以在机器设置为x64的情况下创建图像文件。我认为这是在.NET3.0(又名.NET2.0SP1)中引入的。如果将平台目标设置为x64,则机器类型字段将设置为IMAGE\u FILE\u machine\u AMD64(又名x64)。除了程序永远不会在32位操作系统上运行,并且主线程将使用4MB堆栈而不是1MB堆栈启动之外,这没有多大区别


将32位可执行映像转换为64位进程的魔力如中所述。

您一定是在谈论使用/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
32位标志很重要,0表示使用了任何CPU。ILONLY=1表示程序集仅包含IL,不包含机器代码。使用C++/CLI语言创建程序集时,它将为0

您可以在机器设置为x64的情况下创建图像文件。我认为这是在.NET3.0(又名.NET2.0SP1)中引入的。如果将平台目标设置为x64,则机器类型字段将设置为IMAGE\u FILE\u machine\u AMD64(又名x64)。除了程序永远不会在32位操作系统上运行,并且主线程将使用4MB堆栈而不是1MB堆栈启动之外,这没有多大区别


将32位可执行映像转换为64位进程的魔力如中所述。

您是否正在执行任何特定于平台的p/Invoke?构建机器是什么?x86或x64?我所知没有特定于平台的P/Invoke。如果在文本编辑器中查看.csproj(或.vbproj文件),与在Visual Studio中创建的新项目相比,编译目标看起来合理吗?或者它们看起来奇怪吗?有什么有趣的参考资料吗?可能其中一个参考文献是针对x86的……没有有趣的参考文献,主要是NHibernate、DevEx Reports和SharpArch,以及它们的各种依赖关系。我注意到所有的第三方引用,比如NHibernate说的“14机器(x86)”,即使我没有构建它们。您是否在执行特定于平台的P/Invoke?构建机器是什么?x86或x64?我所知没有特定于平台的P/Invoke。如果在文本编辑器中查看.csproj(或.vbproj文件),与在Visual Studio中创建的新项目相比,编译目标看起来合理吗?或者它们看起来奇怪吗?有什么有趣的参考资料吗?可能其中一个参考文献是针对x86的……没有有趣的参考文献,主要是NHibernate、DevEx Reports和SharpArch,以及它们的各种依赖关系。我注意到所有的第三方引用,比如NHibernate说的“14机器(x86)”,尽管我没有构建它们。