2009-04-20 103 views
17

我想檢查哪個CPU架構是用戶正在運行,它是否是 i386或X64或AMD64。我想用C#來做。 我知道我可以嘗試WMI或註冊表。除了這兩個之外還有別的辦法嗎?我的項目面向.NET 2.0!使用C#識別CPU架構類型

回答

25

你也可以嘗試(僅當它沒有操縱工程):

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") 
+1

如果沒有設置,該怎麼辦? – 2009-04-20 09:57:07

+0

沒有設置去「操縱」的情況下(至少在Vista上,它是默認設置)。我建議它作爲替代方式,不一定是最好的方式。 – 2009-04-20 09:57:50

+0

不錯的答案。 – 2009-04-20 10:01:51

0

你可能會問用戶?

只是開玩笑當然......我想WMI是你會用它的。但也許還有其他方法?

如果你去WMI那麼LinqToWmi可能會有用。我試了一次,它似乎很直接=) - >http://www.codeplex.com/linq2wmi

6

Win32_Processor WMI Class將完成這項工作。使用MgmtClassGen.exe來生成強類型的包裝。

+2

這可能是該問題的最佳答案。 – 2010-05-22 05:51:28

+0

這幫了我很多!感謝和+1! – 2011-12-21 13:33:07

+0

Win32_Processor類應該如何幫助?如果你在談論OSArchitecture,那麼這個屬性在大多數Windows版本中都不可用,只有少數最新版本支持它。 – ivan 2012-03-08 11:36:04

1

也許this CodeProject上的文章可以幫助?它使用System.Management命名空間中的ManagementObjectSearcher來搜索硬件信息。

0

我相信你應該避免像WMI和LINQ那樣的嚴重膨脹,你必須最終獲得更多的信息,而這些信息都不會被臃腫的API和框架所滿足。

只需調用一個調用並提取CPUID信息的dll即可。 C++/CLI或pinvoke會做,並獲得你需要的供應商的所有信息。首先,您需要查看指令是否受支持(99%的時間)。

要快速啓動並運行,請檢查intel網站上的wincpuid示例,並從那裏從cpuid.h中提取該部分。只有2個供應商,一個是內存延遲好,另一個不是(如本地和託管代碼)。所以你會遇到Mono在其他架構等問題(誰不btw)。至於64,你已經知道了,或只是讓corflags(它的存在已經和殺滅與.NET分配客戶的硬盤驅動器)..

http://software.intel.com/en-us/articles/api-detects-ia-32-and-x64-platform-cpu-characteristics/

-3

這裏就是我所做的:

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

如果你在64位體系結構中,你將有兩個程序文件環境變量。如果你使用x86,你只能擁有一個。

-1

這似乎是最簡單的對我說:

System.Environment.Is64BitOperatingSystem 
16

是什麼導致我在這裏是檢查32和64位操作系統。評分最高的回答是查看當前流程的設置。沒有找到答案後,我找到了以下設置。希望這對你有用。

bool is64 = System.Environment.Is64BitOperatingSystem 
9

下面是一段代碼,似乎工作(基於P/Invoke的):

public static ProcessorArchitecture GetProcessorArchitecture() 
    { 
     SYSTEM_INFO si = new SYSTEM_INFO(); 
     GetNativeSystemInfo(ref si); 
     switch (si.wProcessorArchitecture) 
     { 
      case PROCESSOR_ARCHITECTURE_AMD64: 
       return ProcessorArchitecture.Amd64; 

      case PROCESSOR_ARCHITECTURE_IA64: 
       return ProcessorArchitecture.IA64; 

      case PROCESSOR_ARCHITECTURE_INTEL: 
       return ProcessorArchitecture.X86; 

      default: 
       return ProcessorArchitecture.None; // that's weird :-) 
     } 
    } 

[DllImport("kernel32.dll")] 
    private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); 

    private const int PROCESSOR_ARCHITECTURE_AMD64 = 9; 
    private const int PROCESSOR_ARCHITECTURE_IA64 = 6; 
    private const int PROCESSOR_ARCHITECTURE_INTEL = 0; 

    [StructLayout(LayoutKind.Sequential)] 
    private struct SYSTEM_INFO 
    { 
     public short wProcessorArchitecture; 
     public short wReserved; 
     public int dwPageSize; 
     public IntPtr lpMinimumApplicationAddress; 
     public IntPtr lpMaximumApplicationAddress; 
     public IntPtr dwActiveProcessorMask; 
     public int dwNumberOfProcessors; 
     public int dwProcessorType; 
     public int dwAllocationGranularity; 
     public short wProcessorLevel; 
     public short wProcessorRevision; 
    } 

注意此代碼重用現有的CLR的ProcessorArchitecture枚舉,並支持.NET Framework 2及更高版本。

5

最後解決平臺/處理器架構在C#中當前運行的CLR運行時最短的訣竅是:

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

這裏Module.GetPEKind返回ImageFileMachine枚舉,因爲.NET V2它存在:

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

爲什麼不使用new AssemblyName(fullName)typeof(object).Assembly.GetName()
那麼有在ASP.NET MVC源代碼這HACK評論(自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); 
} 

看看他們使用一些隱藏的技巧爲自己。不幸的是,AssemblyName構造函數沒有適當地設置ProcessorArchitecture字段,無論新的AssemblyName如何,它只是None

因此,對於未來的讀者,讓我推薦你用ImageFileMachine使用那個醜陋的GetPEKind!

注:

  • 這將返回當前正在運行的運行架構,而不是基本的系統架構!
    也就是說,唯一的例外是I386運行時可能運行在AMD64系統上。
  • 在mono/ubuntu 14.04/AMD64和.NET/Win7/I386上測試。
0

根據您想知道的原因,您可能會發現檢查IntPtr結構的大小是最簡單的方法。

2

我知道,這個問題是來自過去,但截至2017年,現在有一個簡單的方法來了解當前進程的架構,在.NET標準:

System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture 

返回的值是一個是X86,X64,ARM,ARM64,並給出了它正在運行的進程的體系結構。OSArchitecture代替了返回已安裝操作系統的體系結構。

鏈接的文檔(相當無用的,雖然...):

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

架構枚舉: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=netstandard-1.4

0

這個怎麼樣?

switch (typeof(string).Assembly.GetName().ProcessorArchitecture) { 
    case System.Reflection.ProcessorArchitecture.X86: 
     break; 
    case System.Reflection.ProcessorArchitecture.Amd64: 
     break; 
    case System.Reflection.ProcessorArchitecture.Arm: 
     break; 
} 

但是case *.Arm:尚未測試。