C# 32/64位与.NET可执行文件混淆

C# 32/64位与.NET可执行文件混淆,c#,.net,32bit-64bit,C#,.net,32bit 64bit,我有一个使用C#的VisualStudio2005的可执行版本。dumpbin报告它是x86,并声称它是作为x86目标构建的。然而,当我尝试执行它时,它不知何故变成了一个64位的可执行文件,正如任务管理器、process explorer和procmon报告的那样,它加载了Framework64。最终由于加载32位DLL失败而失败。 什么会导致这种行为?您正在使用AnyCPU目标构建它。如果您希望即使在64位系统上也是x86,那么必须以x86为目标 当您以任何CPU为目标时,加载程序在64位系统

我有一个使用C#的VisualStudio2005的可执行版本。dumpbin报告它是x86,并声称它是作为x86目标构建的。然而,当我尝试执行它时,它不知何故变成了一个64位的可执行文件,正如任务管理器、process explorer和procmon报告的那样,它加载了Framework64。最终由于加载32位DLL失败而失败。
什么会导致这种行为?

您正在使用AnyCPU目标构建它。如果您希望即使在64位系统上也是x86,那么必须以x86为目标


当您以任何CPU为目标时,加载程序在64位系统上作为64位进程运行,但在32位系统上作为32位进程运行。

在项目属性/构建配置列表中将平台目标从“Any”更改为“x86”。

可以使用
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
“什么会导致这种行为?”

从技术上讲,回答这个问题是准确的,但不是完全按照您所问的精神,导致这种行为的原因是缺少64位DLL

为什么程序没有64位版本


几年后,我怀疑32位系统是否会存在于任何地方,除非ARM和ARM系统需要重新编译新的DLL。

好吧,构建它的人声称它是用x86 target构建的。根据dumpbin,可执行文件显示为32位。我如何判断他是否使用x86目标构建了它?它在64位系统上作为64位进程运行这一事实告诉您,它不是以x86为目标构建的。它必须是AnyCPU或x64。如果是x64,我想dumpbin会这么说。Dumpbin将任何CPU目标报告为x86,我想它不知道任何CPU的魔力。因此,我断定是AnyCPU.A.NET EXE包含启动CLR的引导加载程序,以便它可以在托管上下文中运行嵌入的IL代码。我不确定这一点,但有可能引导加载程序以x86运行,当目标是AnyCPU时,它以某种方式加载x64上下文(不确定引导加载程序进程如何工作),因为64位版本的DLL尚未发布?