我想檢查哪個CPU架構是用戶正在運行,它是否是 i386或X64或AMD64。我想用C#來做。 我知道我可以嘗試WMI或註冊表。除了這兩個之外還有別的辦法嗎?我的項目面向.NET 2.0!使用C#識別CPU架構類型
回答
你也可以嘗試(僅當它沒有操縱工程):
System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
你可能會問用戶?
只是開玩笑當然......我想WMI是你會用它的。但也許還有其他方法?
如果你去WMI那麼LinqToWmi可能會有用。我試了一次,它似乎很直接=) - >http://www.codeplex.com/linq2wmi
Win32_Processor WMI Class將完成這項工作。使用MgmtClassGen.exe來生成強類型的包裝。
這可能是該問題的最佳答案。 – 2010-05-22 05:51:28
這幫了我很多!感謝和+1! – 2011-12-21 13:33:07
Win32_Processor類應該如何幫助?如果你在談論OSArchitecture,那麼這個屬性在大多數Windows版本中都不可用,只有少數最新版本支持它。 – ivan 2012-03-08 11:36:04
也許this CodeProject上的文章可以幫助?它使用System.Management命名空間中的ManagementObjectSearcher來搜索硬件信息。
我相信你應該避免像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/)
這裏就是我所做的:
public static bool Isx86()
{
return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0);
}
如果你在64位體系結構中,你將有兩個程序文件環境變量。如果你使用x86,你只能擁有一個。
這似乎是最簡單的對我說:
System.Environment.Is64BitOperatingSystem
是什麼導致我在這裏是檢查32和64位操作系統。評分最高的回答是查看當前流程的設置。沒有找到答案後,我找到了以下設置。希望這對你有用。
bool is64 = System.Environment.Is64BitOperatingSystem
下面是一段代碼,似乎工作(基於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及更高版本。
最後解決平臺/處理器架構在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上測試。
根據您想知道的原因,您可能會發現檢查IntPtr結構的大小是最簡單的方法。
我知道,這個問題是來自過去,但截至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
這個怎麼樣?
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:
尚未測試。
如果沒有設置,該怎麼辦? – 2009-04-20 09:57:07
沒有設置去「操縱」的情況下(至少在Vista上,它是默認設置)。我建議它作爲替代方式,不一定是最好的方式。 – 2009-04-20 09:57:50
不錯的答案。 – 2009-04-20 10:01:51