如何在C#中确定我的处理器是32位还是64位?

6
在C#中如何知道我的处理器是32位还是64位?
8个回答

6

5

在C#中本地检查的最简单方法是:

var size = IntPtr.Size;

size的值将等于4或8,但更重要的问题是你为什么需要知道呢?


4
这并没有告诉你这是什么类型的处理器,只是告诉你当前应用程序的运行方式。 - Guffa

5
你可以使用System.Management.ManagementObject查询WMIWin32_Processor
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;
}

请查看MSDN Library描述以获取其他处理器代码。

这样做的一个问题是运行程序的用户需要具有查看WMI的权限。


2
我可以在没有管理员权限的情况下成功查询Win32_Processor类(来自PowerShell)。此外,您可以仅查询AddressWidth/DataWidth而不是体系结构,因为体系结构6(Itanium)也将是64位。不要假设只有x86和x86_64存在。 - Joey

3

您可以从注册表中获取CPU(和更多)信息:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor

有一个或多个子键(每个核心一个)称为0、1、2等。每个子键都包含有关核心的信息,包括标识符,其中包含x86或某些64位文本,包括处理器系列和型号。


这是正确的,但仅适用于 Windows 计算机。我认为这不适用于 Silverlight、Phone 7 应用程序或在 Mono/Linux 上运行的应用程序。 - matt

2

2

如果你只想知道当前应用程序是作为32位应用程序还是64位应用程序运行,只需使用 IntPtr.Size 属性。

int bits = IntPtr.Size * 8;

要找到有关实际处理器的信息比较困难。这里是一个库,可以获取一些信息,但该页面并没有说明是否获取了特定的信息。您可以从注册表获取一些信息,但我没有检查出那里有多少信息。


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;
    }
}

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;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接