如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?

Posted

技术标签:

【中文标题】如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?【英文标题】:How do you make a .NET executable run as a 32-bit process on a 64-bit OS? 【发布时间】:2011-03-16 13:01:26 【问题描述】:

我想让我的 .NET 应用程序在 .NET1.1 的 64 位机器上作为 32 位进程运行。目标平台选项是在以后的VS(2005)版本中引入的,但是我使用的是VS2003和.NET1.1,没有机会使用其他VS或.Net

这可能吗?

附:我不知道这是否相关,但我的一位同事说我应该使用“cor flags”或“core flags”,但谷歌搜索并没有得出任何有趣的结果

【问题讨论】:

当前是否在 64 位模式下运行?我确信它会按照您预期的方式运行,除非您在 64 位机器上进行编译。无论如何,VS 始终是 32 位应用程序。 @Kangkan:我不知道它是如何运行的。问题是我的应用程序在 64 位操作系统上运行时崩溃(其中一个 P/invoke 调用崩溃了,目标函数永远不会被调用)。所以我不知道还能做什么...... 你的编程语言是什么?顺便说一句,您使用 C++ 并使用指针吗? @Kangkan:我正在使用 C# 并大量使用互操作。是的,有很多 IntPtr' 涉及,因为我从 DLL 调用多个 C++ 函数.. 【参考方案1】:

您可以告诉 Windows 以 32 位运行应用程序。

试试:corflags myassembly.exe /32bit+

见the docs of the corflags.exe utility。

*** 有一个excellent summary of CorFlags here。

【讨论】:

此工具是 .NET Framework 2.0 版中的新工具。 - 写在您链接的页面上。【参考方案2】:

你不需要做任何事情。 .NET 1.1 不支持在 64 位模式下运行托管代码。直到 .NET 2.0 才可用。任何用 VS2003 编译的 EXE 程序集都会要求 1.1 版本的 CLR,它会自动以 32 位模式运行托管代码。

同样,您也不会拥有 Corflags.exe 实用程序。它最初随 .NET 2.0 SDK 一起提供,现在随 Windows SDK 一起提供。 Visual Studio 2005 及更高版本允许您通过在项目选项中选择“平台目标”来设置 Corflags.exe 操作的 cor 标头中的选项位。

请注意未安装 .NET 1.1 的 64 位计算机。他们将使用第 2 版 CLR 运行您的应用程序,并将在 64 位模式下运行。在 Vista 及更高版本中实现的 UAC 也会引起麻烦,您的 EXE 将没有清单,Windows 会将其视为旧程序。当效果不佳时,这可能很难诊断。并且 VS2003 在 XP 之后的操作系统上不受支持。有一个缺陷列表,大部分都是调试问题。顺便说一句,让您的工具与客户的操作系统功能保持同步非常重要,8 年对于狗年和软件工具来说是一段很长的时间。

【讨论】:

@Armen:答案就在这里。看看为什么你的代码在 64 位机器上会出错。【参考方案3】:

您可能需要手动使用编译器并指定目标平台:

http://msdn.microsoft.com/en-us/library/zekwfyz4(v=vs.80).aspx

【讨论】:

【参考方案4】:

它不应该什么都不做吗? 1.1 只有 32 位。如果 .NET 1.1 不存在,您的程序将使用存在的版本运行,但也许框架足够智能,知道 1.1 应用程序只能以 32 位运行。

否则你可以尝试在机器上安装 1.1,这样你的应用就会被绑定到它并且只能以 32 位运行。

http://technet.microsoft.com/en-us/library/cc785813(WS.10).aspx

这似乎证实了我的理论:

http://blogs.artinsoft.net/pdermody/archive/2005/04/07/153.aspx

加载 .NET 1.1 应用程序 Windows 64 位

我惊讶地发现 - 你可能会惊讶地听到 - 微软决定不允许 甚至是纯 .NET 应用程序 建立在 32 位机器上,具有某些 要运行的 Visual Studio 版本 64 位 CLR。​​

【讨论】:

【参考方案5】:

在配置管理器中,您应该能够将平台选择为 x86 - 我猜是这样做的,因为我想不出它还有什么用处。

编辑:哦,原来是optimization thing。该死的,现在我的名声再也没有整数了……

【讨论】:

以上是关于如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中确定可执行文件是 64 位还是 32 位 [重复]

如何强制 MSBuild 编译为 32 位模式?

为 Windows 编写跨平台(32 位和 64 位兼容)程序(如 .NET 中的 AnyCPU)

如何从 32 位进程启动 64 位进程

电脑显示你不能在64位文件上执行DEP属性怎么处理?

为啥 cx_Freeze 在 64 位 Debian Linux 上运行时使 32 位可执行?