Identifying the CPU architecture type using C#

前端 未结 14 2110
心在旅途
心在旅途 2020-12-01 17:52

I want to check which CPU architecture is the user running, is it i386 or X64 or AMD64. I want to do it in C#. I know i can try WMI or Registry. Is there any other way apart

相关标签:
14条回答
  • 2020-12-01 18:43

    What led me here is checking for a 32 vs 64 bit OS. the highest rated answer is looking at the setting for the Current process. After not finding an answer I found the following setting. Hope this works for you.

    bool is64 = System.Environment.Is64BitOperatingSystem
    
    0 讨论(0)
  • 2020-12-01 18:44

    Here's what I did:

    public static bool Isx86()
    {
        return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0);
    }
    

    If you're on 64 bit architecture you'll have two program file env variables. If you're on x86, you'll only have the one.

    0 讨论(0)
  • 2020-12-01 18:47

    Finally the shortest trick to resolve the platform/processor architecture for the current running CLR runtime in C# is:

    PortableExecutableKinds peKind;
    ImageFileMachine machine;
    typeof(object).Module.GetPEKind(out peKind, out machine);
    

    Here Module.GetPEKind returns an ImageFileMachine enumeration, which exists since .NET v2:

    public enum ImageFileMachine
    {
        I386    = 0x014C,
        IA64    = 0x0200,
        AMD64   = 0x8664,
        ARM     = 0x01C4    // new in .NET 4.5
    }
    

    Why not use new AssemblyName(fullName) or typeof(object).Assembly.GetName()?
    Well there is this HACK comment in ASP.NET MVC source code (since 1.0):

    private static string GetMvcVersionString() {
        // DevDiv 216459:
        // This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in
        // medium trust. However, Assembly.FullName *is* accessible in medium trust.
        return new AssemblyName(typeof(MvcHttpHandler).Assembly.FullName).Version.ToString(2);
    }
    

    See they use some hidden tricks for themselves. Sadly, the AssemblyName constructor doesn't set the ProcessorArchitecture field appropriately, it's just None for whatever new AssemblyName.

    So for future readers, let me recommend you using that ugly GetPEKind with ImageFileMachine!

    Notes:

    • This returns the current running runtime architecture, not the underlying system architecture!
      That said, the only exception is that an I386 runtime may run on an AMD64 system.
    • Tested on mono/ubuntu 14.04/AMD64 and .NET/Win7/I386.
    0 讨论(0)
  • 2020-12-01 18:52

    I know that this question is from the past, but as of 2017, there is now a simple method to know the architecture of the current process, in .net standard :

    System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture
    

    The value returned is one of X86, X64, ARM, ARM64 and gives the architecture of the process it's running in. OSArchitecture returns the architecture of the installed operating system instead.

    Links to the docs (pretty useless though...):

    RuntimeInformation.ProcessArchitecture: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.runtimeinformation.processarchitecture?view=netstandard-1.4

    Architecture enumeration: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=netstandard-1.4

    0 讨论(0)
  • 2020-12-01 18:52

    Maybe this CodeProject article could help? It uses the ManagementObjectSearcher in the System.Management namespace to search for hardware info.

    0 讨论(0)
  • 2020-12-01 18:53

    This seems the simplest to me:

    System.Environment.Is64BitOperatingSystem
    
    0 讨论(0)
提交回复
热议问题