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

时间:2009-03-27 10:28:17

标签: c#

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

8 个答案:

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