【问题标题】:Why is 32 bit executable not running under WoW64?为什么 32 位可执行文件不能在 WoW64 下运行?
【发布时间】:2017-05-11 13:25:00
【问题描述】:

在我的 32 位系统 (Windows 10) 上,我创建了一个非常简单的 Windows Forms (.NET FW 3.5) 应用程序:

        bool x86 = IntPtr.Size == 4;

        if (x86)
        {
            label1.Text = "OS: 32 bit";
        }
        else // IntPtr.Size == 8
        {
            label1.Text = "OS: 64 bit";

            // For following method, see:
            // http://stackoverflow.com/a/336729/360840
            if (InternalCheckIsWow64())
            {
                label1.Text += "; 32 bit program running under WoW64";
            }
        }

在 Visual Studio 2015 中,在 Properties -> Build 下,我将 Platform Target 设置为 x86。

我将此可执行文件安装到 64 位 Windows Server 2012 Datacenter 版本并运行它。我完全希望看到它报告自己在 WoW64 下运行,但惊讶地发现事实并非如此。它只报告架构是64位,但不显示“; 32位程序在WoW64下运行”部分。

为什么会这样,发生了什么?

【问题讨论】:

  • 等等。标签实际上设置为“OS:64 位”,构建目标设置为 x86?
  • 是的,32 位应用程序可以在 64 位系统上运行。
  • 这不是我的问题。据我记得,将构建设置为 x86,应该强制 IntPtr.Size 为 4(因为该过程将是一个 32 位进程(这正是我现在在我的 PC 上的测试控制台应用程序中看到的行为) ))。这就是为什么我问,如果在这种情况下标签真的设置为“OS:64 位”。
  • 嗯,你是对的。平台:任何 CPU,平台目标:x86,在 64 位服务器上,它显示“OS:32 位”。这是一个全新的转折。我的基本理解,无论如何都是摇摇欲坠的,现在被枪杀了。
  • 我将 if 语句倒置,修复它,现在它可以正常工作了。请将您的原始评论发布为答案,以便我将其标记为答案。非常感谢。

标签: c# x86 wow64


【解决方案1】:

IntPtr.Size 由进程本身(或者更好地说,构建目标)设置,而不是由操作系统设置。

在 c# 中使用 x86 目标构建的程序将始终具有 IntPtr.Size = 4,而 x64 将始终具有 IntPtr.Size = 8。这实际上是对进程的检查,而不是对操作系统的检查。

编辑:链接主题中的答案完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2022-11-12
    • 2011-09-12
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多