如何知道我的处理器在C#中是32位还是64位?
答案 0 :(得分:6)
对于使用.NET 4.0或更高版本的用户,有一个内置属性System.Environment.Is64BitOperatingSystem
可以为您提供此信息。
答案 1 :(得分:5)
本地检查C#的最简单方法是:
var size = IntPtr.Size;
大小将等于4或8,但更大的问题是为什么你需要知道?
答案 2 :(得分:5)
您可以使用WMI
查询Win32_Processor
班级System.Management.ManagementObject
ManagementObject mo;
mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
ushort i = (ushort)mo["Architecture"];
switch (i)
{
case 0:
return "32 Bit";
break;
case 9:
return "64 Bit";
break;
}
请查看the MSDN Library description了解其他处理器代码。
问题在于运行程序的用户需要具有查看WMI的权限。
答案 3 :(得分:3)
您可以从注册表中获取CPU(及更多)信息:
HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor
有一个或多个子密钥(每个核心一个),称为0,1,2等。每个子密钥包含有关核心的信息,包括标识符,其中包含x86或64位文本,包括处理器系列和型号。 / p>
答案 4 :(得分:2)
如果您只想查看当前应用程序是作为32位应用程序还是64位应用程序运行,请使用IntPtr.Size
属性。
int bits = IntPtr.Size * 8;
要找出有关实际处理器的信息更难。 Here is a library获取一些信息,但页面不会告诉它是否获得该特定信息。您可以get some information from the registry,我还没有查看有多少信息。
答案 5 :(得分:2)
您也可以使用P / Invoke调用GetNativeSystemInfo并获取SystemInfo结构。
另一种解决方案如下:
isWow64 = false;
if (System.Environment.OSVersion.Version.Major >= 5 &&
System.Environment.OSVersion.Version.Minor >= 1)
{
var processHandle = GetProcessHandle((uint)
System.Diagnostics.Process.GetCurrentProcess().Id);
bool retVal;
if (!NativeMethods.IsWow64Process(processHandle, out retVal))
{
throw (new Win32Exception());
}
isWow64 = retVal;
}
替代解决方案(但不推荐):)
public bool Is64bitOS
{
get
{
return Environment.GetEnvironmentVariable("ProgramFiles(x86)")
!= null;
}
}
public string ProgramFilesX86
{
get
{
string programFiles =
Environment.GetEnvironmentVariable("ProgramFiles(x86)");
if (programFiles == null)
{
programFiles = Environment.GetEnvironmentVariable(
"ProgramFiles");
}
return programFiles;
}
}
答案 6 :(得分:2)
通过WMI查询Win32_Processor课程
答案 7 :(得分:0)
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);
public static bool Is64Bit()
{
bool retVal;
IsWow64Process(Process.GetCurrentProcess().Handle, out retVal);
return retVal;
}