【问题标题】:.NET Framework get running processor architecture.NET Framework 获得运行的处理器架构
【发布时间】:2010-12-01 11:41:27
【问题描述】:

这里有一个所有支持的处理器架构的枚举:http://msdn.microsoft.com/en-us/library/system.reflection.processorarchitecture.aspx

有没有什么方法可以判断哪个对应运行环境呢? System.Reflection.Assembly.GetExecutingAssembly().ProcessorArchitecture 返回 MSIL——显然是错误的。

编辑:Bojan Resnik 发布了一个答案并将其删除。我看到需要从我得到的部分跟踪中进行一些澄清。

程序集需要在多种架构上运行,并根据运行进程接受的程序集指令执行不同的操作。本质上,我需要选择要加载的本机 DLL 版本。每种架构都有一个。

【问题讨论】:

  • 不是骗子。如果我在 WOW 中运行,我想要 x86 而不是 x64。
  • 您真的需要区分所有这些架构,还是只需要区分 x86/x64?
  • 如果我看到 Itanium 而不是因为在 Itanium 上加载 X64 而死,我想给出一个适当的错误。
  • Identifying the CPU architecture type using C# 上的相关答案也适合这个问题,无需使用 Module.GetPEKind 和 ImageFileMachine 枚举进行 p/invoke!

标签: .net pinvoke processor .net-assembly


【解决方案1】:

您可以为此使用System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture。这是在 .NET Framework 4.7.1 中添加到 .NET 中的。

【讨论】:

  • 有人在这里发表评论说它不适用于 ARM64;但是,无论如何,在我提出这个问题时,这些都不存在。您注意到我谈论的是 Itanium 而不是 arm。 stackoverflow.com/a/45373756/14768 ;不过,尝试更新新平台的答案也不错。
  • 问题是专门询问进程使用什么处理器架构。在 ARM64 上使用 .NET Framework 时,System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture 正确返回 x86。 ARM64 上的 .NET 框架从 MSIL jit 到 x86,然后由 Windows 再次从 x86 到 ARM64 的 JIT。请注意,.NET Core 2.1 和更高版本确实支持 JIT 直接编译到 ARM64。
  • 这在我的用例中会爆炸,因为我会将 x86_32 本机 DLL 加载到 ARM64 进程中。
  • 从 Windows 的角度来看,.NET Framework 进程将是一个可以加载 x86 本机 DLL 的 x86 进程。您实际上将无法加载 ARM64 DLL,因为它是一个 x86 进程,并且 x86 在 ARM64 的 WOW64 容器中运行。
【解决方案2】:

P/Invoking GetSystemInfo 在 .Net 中是微不足道的,并且比 WMI 轻得多。此外,它返回进程所看到的体系结构,因此在 x64 机器上,WOW 进程将看到 x86,而本机进程将看到 x64。

【讨论】:

    【解决方案3】:

    这里有一些您可能想尝试的 WMI 设置。目前我手头没有 64 位系统,但应该很容易检查。源代码如下。请注意,您最终可能不得不使用多种调用组合(例如,一个查找 wow,另一个查找本地 32 与 64 等)。

    另外,请查看http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/b1cfef99-5247-47c5-93d4-31eb6849df48 进行更多讨论。

    using System;
    using System.Management;
    class Program
    {
        static void Main(string[] args)
        {
            foreach (ManagementBaseObject o in new ManagementClass("Win32_OperatingSystem").GetInstances())
            {
                Console.WriteLine("Win32_OperatingSystem.OSArchitecture = " + o.Properties["OSArchitecture"].Value);
                break;
            }
            foreach (ManagementBaseObject o in new ManagementClass("Win32_ComputerSystem").GetInstances())
            {
                Console.WriteLine("Win32_ComputerSystem.SystemType = " + o.Properties["SystemType"].Value);
                break;
            }
            Console.ReadKey();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多