【问题标题】:How to determine if the executing program was compiled for 64 bit?如何确定正在执行的程序是否编译为 64 位?
【发布时间】:2009-03-11 18:51:30
【问题描述】:

我需要让我的程序确定它是针对 32 位 Windows 还是 64 位/任何 CPU 编译的。我需要根据编译选项选择不同的 COM 服务器标志。有什么想法吗?

【问题讨论】:

  • 您更关心它当前是作为 32 位还是 64 位应用程序运行?

标签: c# 64-bit


【解决方案1】:

在运行时检查您是否正在运行 64 位应用程序:

要查看您的进程是 64 位还是 32 位,您只需检查 IntPtr.Size 或任何其他指针类型。如果你得到 4,那么你在 32 位上运行。如果你得到 8,那么你是在 64 位上运行的。

您的进程运行的是什么类型的计算机:

您可以检查 PROCESSOR_ARCHITECTURE 环境变量以查看您是否在 x64、ia64 或 x86 机器上运行。

您的进程是否在仿真下运行:

Win32 API IsWow64Process 将告诉您是否在 x64 下运行 32 位应用程序。 Wow64 表示 windows64 上的 windows32。

与其他人发布的相反:IsWow64Process 不会告诉您您是在运行 32 位还是 64 位应用程序。在 32 位机器上,它会在运行 32 位应用程序时告诉您 FALSE,而在 64 位机器上,它会告诉您 TRUE 对于 32 位应用程序。它只会告诉您您的应用程序是否在仿真下运行。

【讨论】:

  • 嗨,Brian,_WIN64 似乎没有在 vs2008 中定义。有什么想法吗?
  • 我更新了我的答案,抱歉一开始我以为你说的是​​ c++。我用 C# 信息更新了它。
【解决方案2】:

你知道Environment.Is64BitProcess吗? 判断当前运行的进程是否为64位进程。

【讨论】:

    【解决方案3】:

    您需要 Microsoft 的 CORFLAGS 命令行应用程序。 http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx

    【讨论】:

    • corflags 命令行工具如何帮助识别程序集是为 32 位/64 位或 MSIL 构建的?
    • 我找到了答案。 stackoverflow.com/questions/270531/…。感谢您的贡献@Walden Leverich
    【解决方案4】:

    您可以使用IsWow64Process 函数在运行时确定您的 COM 服务器是 x64 还是 win32 进程。

    如果您只想在编译时知道这一点:编译器会设置 _WIN64 宏。

    【讨论】:

    • 来自文档:“如果应用程序是在 64 位 Windows 下运行的 64 位应用程序,则 Wow64Process 参数设置为 FALSE。”... 这有什么帮助?
    • IsWow64Process 不会告诉您是在运行 32 位还是 64 位应用程序。在 32 位机器上它会在运行时告诉你 FALSE,而在 64 位机器上它会告诉你 TRUE 对于 32 位应用程序。
    • 嗯,_WIN64 显然不起作用。即使我在 64 位编译,代码也是灰色的
    • _WIN64 是一个 c++ 定义,我不认为它是为 c# 定义的
    • _WIN64 由编译器定义。但我认为您使用的是 C++ 而不是 C# - 我的错误。
    【解决方案5】:

    使用GetBinaryType api函数,您将获得文件的类型

    这是msdn上的api链接http://msdn.microsoft.com/en-us/library/aa364819(VS.85).aspx

    结果是:

    SCS_32BIT_BINARY = 32 位可执行文件

    SCS_64BIT_BINARY = 64 位可执行文件

    SCS_DOS_BINARY = DOS

    SCS_OS216_BINARY = OS/2

    SCS_WOW_BINARY = 16 位

    SCS_POSIX_BINARY = 基于 POSIX

    SCS_PIF_BINARY = 在 DOS 上执行的 PIF 文件

    【讨论】:

      【解决方案6】:

      【讨论】:

        【解决方案7】:

        您可以通过设置编译时间常量来执行此操作,并根据这些常量执行#ifs 以设置一个值,您可以检查该应用程序是为哪个平台编译的。见Target platform/processor at compile time

        其他最简单的方法是检查 IntPtr.Size 属性,看看它是 4(32 位)还是 8(64 位)。

        【讨论】:

          【解决方案8】:

          虽然这似乎是一条奇怪的路线,但您可以通过检查 IntPtr.Size 来判断您是在 32 位(或 WOW64 中的 64 位)还是 64 位 .NET 代码中运行。

          在 32 位/WOW64 上,IntPtr.Size 为 4。

          在 64 位上,IntPtr.Size 为 8。

          来源:MSDN 上的Migrating 32-bit Managed Code to 64-bit Managed Code

          【讨论】:

            【解决方案9】:

            您可以使用预定义宏来检查编译类型

               #if (_WIN64) 
                    const bool IS_64 = true;
                #else
                   const bool IS_64 = false;
                #endif
            

            【讨论】:

              猜你喜欢
              • 2013-09-22
              • 2018-02-26
              • 2021-05-18
              • 2012-06-20
              • 2010-09-14
              • 2018-12-29
              • 2010-12-23
              • 2018-06-19
              • 2013-06-25
              相关资源
              最近更新 更多