【问题标题】:How do I determine if a .NET application is 32 or 64 bit?如何确定 .NET 应用程序是 32 位还是 64 位?
【发布时间】:2011-04-16 11:33:02
【问题描述】:

我有一个 .NET 应用程序,它应该被编译为仅 32 位的应用程序。我怀疑我的构建服务器实际上并没有这样做。

如何确定 .NET 应用程序是否实际设置为在 32 位模式下运行?

【问题讨论】:

  • 不清楚您在问什么 - 您是否有要检查的 dll 或要检查的应用程序?
  • @jaco - 没关系。 exe 也是一个程序集。他的主要观点是它需要在外部完成,因为生成的程序是构建服务器的结果。
  • 没错,但我想弄清楚他在看什么。但你是对的,这应该没关系。

标签: .net


【解决方案1】:

如果您要检查正在运行的应用程序是在 32 位还是 64 位模式下运行,请打开任务管理器并检查它是否带有星号 (*32 ) 在进程名称旁边。

编辑(从 manna 的回答中导入):从 Win8.1 开始,进程的“bittyness”列在标记为 Platform 的单独详细信息列中。 (右键单击任何列标题以显示 选择列 菜单。)

如果您有一个已编译的 dll,并且您想检查它是针对 32 位还是 64 位模式编译的,请执行以下操作(来自 related question)。 我认为您希望为 AnyCPU 编译 dll

打开 Visual Studio 命令提示符并键入“corflags [您的程序集]”。你会得到这样的东西:

c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>corflags "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" Microsoft (R) .NET Framework CorFlags 转换工具。版本 3.5.21022.8 版权所有 (c) Microsoft Corporation。版权所有。 版本:v2.0.50727 CLR 标头:2.5 聚乙烯:PE32 CorFlags : 24 仅 : 0 32位:0 签名:1

您正在关注 PE 和 32BIT

AnyCpu:

PE:PE32 32位:0

x86:

PE:PE32 32位:1

x64:

PE:PE32+ 32位:0

【讨论】:

  • 谢谢,这正是我想要的。 (虽然你的回答也让我有点生气,因为我知道 CorFlags 可以更改设置,但文档中没有任何内容告诉我它也可以读取它。)
  • 顺便说一句,它在 VS 2017 中被称为“VS 的开发人员命令提示符”。 (改名让人很难找。)
【解决方案2】:

要在运行时执行此操作...

您可以评估IntPtr.Size。如果IntPtr.Size == 4 则为 32 位 (4 x 8)。如果IntPtr.Size == 8 则为 64 位 (8 x 8)

【讨论】:

  • 这听起来像是运行时,而不是设计时。
  • 还是有用的;如果您想在运行时做出任何基于平台的决策。
  • 我测试过,这也适用于 UWP 应用程序。
【解决方案3】:

我在搜索相同的信息时发现,从 Windows 8.1 开始,就没有星号了。

您有一个名为“平台”的任务管理器详细信息列。它的内容是“32位”或“64位”。

【讨论】:

    【解决方案4】:

    我使用以下代码:

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWow64Process(
        [In] IntPtr hProcess,
        [Out] out bool wow64Process
    );
    

    与:

    public static bool IsProcess64(Process process)
    {
        if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6) {
            bool ret_val;
    
            try {
                if (!WindowsAPI.IsWow64Process(process.Handle,out ret_val)) ret_val = false;
            } catch {
                ret_val = false;
            }
    
            if (!ret_val && IntPtr.Size == 8) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    

    你可以传递 Process.CurrentProcess 或类似的。

    【讨论】:

    • 这有一些缺陷,主要与异常处理有关:“catch-all-and-everything”子句还将捕获诸如 OutOfMemoryException、ThreadAbortException、AccessViolationException 等所有表明状态不佳的东西CLR 与有问题的进程无关,不是 64 位系统(WOW64)上的 32 位进程。然后,如果在没有权限的情况下调用进程或已经消失,“Handle”属性将引发异常 - 它仍然可能是 32 位进程。最后,如果 IntPtr.Size 为 64,则该进程为 64 位 - 无需再检查其他内容。
    • 是的,我已经很久没有改过这段代码了。我真的应该解决所有这些问题。
    【解决方案5】:

    如果您想以非编程方式测试程序集,可以使用corflags.exe

    >corflags.exe <assembly>
    
    <listing of header information, among them the 32bit-ness>
    

    【讨论】:

      【解决方案6】:

      最快的方法可能是在 64 位机器上运行时,它会在任务管理器中的名称后加一个星号 (*)。星号表示它在 syswow64 中运行,因此它被标记为 32 位。

      另一种方法是针对它运行 corflags.exe,这将显示您所追求的答案。这是 .NET SDK 附带的。

      【讨论】:

      • 同意,任务管理器始终准确。 Corflags 只显示意图。
      【解决方案7】:

      好吧,如果您使用的是 .NET 4.0,则有 System.Environment.Is64BitProcess

      【讨论】:

      • 我不认为这是在回答 OP 的问题。
      • 程序集中是否有一些标志表明是否将其 JIT 为 32、64 或任何一个?
      • @Will A:OP 不能将该代码放在他的应用程序中并使其在加载(或其他内容)时显示消息吗?这是一个诚实的问题——我真的认为这就是他想要的。既然我看到了其他一些答案,我意识到也许他想要一些超出流程本身的东西。
      • @Dan - 公平点,任务管理器将是一种更容易确定的方法,但是,这当然有效 - 对不起 Dan!
      • 在运行时,不检查sizeof(IntPtr) 吗? (而且,是的,我知道这不能回答 OP 的问题,但它与 Dan 的回答有关。)
      猜你喜欢
      • 2011-04-04
      • 2011-04-19
      • 2010-12-23
      • 1970-01-01
      • 2010-10-23
      • 2010-09-19
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多