什么是在.NET 2.0上检测Windows OS体系结构(x86,x64)的最可靠方法

时间:2010-06-01 06:12:41

标签: c#

我正在使用Visual C#2010 express,我需要最可靠的方式(在按钮点击)和.NET 2.0框架中检测窗口当前是否在消息框中是x86或x64 ..到目前为止我一直在使用这段代码,但我需要知道是否有更准确的方法?

        string target = @"C:\Windows\SysWow64";
        {
            if (Directory.Exists(target))
            {
               MessageBox.Show("x64");
            }
            else
            {
               MessageBox.Show("x86");
            }

5 个答案:

答案 0 :(得分:9)

到目前为止,最简单的测试是检查IntPtr的大小:

        if (IntPtr.Size == 8)
        {
           MessageBox.Show("x64");
        }
        else
        {
           MessageBox.Show("x86");
        }

假设您使用默认的平台目标设置为“任何CPU”来构建EXE。请注意,此默认值在VS2010中已更改。

答案 1 :(得分:7)

您可以使用PROCESSOR_ARCHITECTURE环境变量...

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

它将返回以下之一:x86,AMD64,IA64。

您可能只对x86和AMD64值感兴趣,IA64不是很受欢迎,未来微软也不会支持它。它适用于Itanium和Itanium 2处理器。

另一个简单的方法是查看注册表,看看SOFTWARE\Wow6432NodeHKLM是否存在HKCU

答案 2 :(得分:6)

我认为最好的方法是使用:System.Environment.Is64BitOperatingSystem

答案 3 :(得分:4)

这有一段时间了。我相信它与.NET 2.0兼容,但我不完全确定。你可能只对0和9的情况感兴趣(它们是最常见的)。

public static string GetCpuArch()
{
    ManagementScope scope = new ManagementScope();
    ObjectQuery query = new ObjectQuery("SELECT Architecture FROM Win32_Processor");
    ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection results = search.Get();

    ManagementObjectCollection.ManagementObjectEnumerator e = results.GetEnumerator();
    e.MoveNext();
    ushort arch = (ushort)e.Current["Architecture"];

    switch (arch)
    {
        case 0:
            return "x86";
        case 1:
            return "MIPS";
        case 2:
            return "Alpha";
        case 3:
            return "PowerPC";
        case 6:
            return "Itanium";
        case 9:
            return "x64";
        default:
            return "Unknown Architecture (WMI ID " + arch.ToString() + ")";
    }
}

答案 4 :(得分:2)

PROCESSOR_ARCHITECTURE环境变量包含正在运行的进程的地址宽度,该地址宽度不一定是操作系统或处理器的地址宽度。快速查看此方法的方法是运行以下命令...

$Env:PROCESSOR_ARCHITECTURE

...在32位和64位PowerShell会话中并比较输出。

因此,如果GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")返回"AMD64",那么您肯定拥有64位进程,操作系统和处理器。如果它返回"x86",那么你肯定有一个32位进程,但你仍然不知道操作系统和处理器是32位还是64位。

如果你真的在操作系统的地址宽度之后,那么.NET 4提供了Environment.Is64BitOperatingSystem property。您还可以在任何版本的.NET上使用WMI来读取Win32_OperatingSystem classOSArchitecture属性:

static string GetOSArchitecture()
{
    var query = new WqlObjectQuery("SELECT OSArchitecture FROM Win32_OperatingSystem");

    using (var searcher = new ManagementObjectSearcher(query))
    using (var results = searcher.Get())
    using (var enumerator = results.GetEnumerator())
    {
        enumerator.MoveNext();

        return (string) enumerator.Current.GetPropertyValue("OSArchitecture");
    }
}

...但不幸的是,OSArchitecture属性仅存在于Windows Vista / Server 2008及更高版本上。

对于自2000年以来的所有Windows版本,您可以尝试p /调用GetSystemInfo() function并检查SYSTEM_INFO structurewProcessorArchitecture成员。