我使用C#使用Visual Studio 2005进行可执行构建。 dumpbin报告它是x86,声称它是作为x86目标构建的。但是,当我尝试执行它时,它会以某种方式变成64位可执行文件,由任务管理器报告,进程资源管理器和procmon显示它加载了Framework64。并且最终由于未能加载32位DLL而失败。 什么可能导致这种行为?
答案 0 :(得分:19)
您正在使用AnyCPU目标构建它。如果你想要它甚至在64位系统上是x86,那么你必须以x86为目标。
当您以AnyCPU为目标时,加载程序在64位系统上以64位进程运行该进程,在32位系统上以32位进程运行。
答案 1 :(得分:3)
在项目属性/构建配置列表中将平台目标从“任意”更改为“x86”。
答案 2 :(得分:3)
可以使用corflags.exe
强制它以32位运行。
O:\>corflags
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.
Usage: Corflags.exe Assembly [options]
If no options are specified, the flags for the given image are displayed.
Options:
/ILONLY+ /ILONLY- Sets/clears the ILONLY flag
/32BIT+ /32BIT- Sets/clears the 32BIT flag
/UpgradeCLRHeader Upgrade the CLR Header to version 2.5
/RevertCLRHeader Revert the CLR Header to version 2.0
/Force Force an assembly update even if the image is
strong name signed.
WARNING: Updating a strong name signed assembly
will require the assembly to be resigned before
it will execute properly.
/nologo Prevents corflags from displaying logo
/? or /help Display this usage message
答案 3 :(得分:0)
“什么可能导致这种行为?”
为了在回答这个问题时技术上准确,但不完全符合你的要求,导致这种行为的原因是缺少64位DLL。
为什么程序没有64位版本?
几年后我怀疑32位系统将存在于任何地方,除非ARM和ARM系统需要重新编译新的DLL。