一尘不染

如何使用.NET检测Windows 64位平台?

c#

.NET 2.0
C#应用程序中,我使用以下代码来检测操作系统平台:

string os_platform = System.Environment.OSVersion.Platform.ToString();

这将返回“ Win32NT”。问题是,即使在64位Windows Vista上运行,它也会返回“ Win32NT”。

还有其他方法可以知道正确的平台(32或64位)吗?

请注意,当在Windows 64位上作为32位应用程序运行时,它也应该检测到64位。


阅读 230

收藏
2020-05-19

共1个答案

一尘不染

如果在64位Windows上的32位.NET Framework 2.0中运行,IntPtr.Size将不会返回正确的值(它将返回32位)。

正如Microsoft的Raymond
Chen所描述的,您必须首先检查是否在64位进程中运行(我认为在.NET中,您可以通过检查IntPtr.Size来执行此操作),并且如果您在32位进程中运行,则仍然必须调用Win
API函数IsWow64Process。如果返回true,则说明您正在64位Windows上以32位进程运行。

Microsoft的Raymond Chen:
如何以编程方式检测您是否在64位Windows上运行

我的解决方案:

static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
    [In] IntPtr hProcess,
    [Out] out bool wow64Process
);

public static bool InternalCheckIsWow64()
{
    if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
        Environment.OSVersion.Version.Major >= 6)
    {
        using (Process p = Process.GetCurrentProcess())
        {
            bool retVal;
            if (!IsWow64Process(p.Handle, out retVal))
            {
                return false;
            }
            return retVal;
        }
    }
    else
    {
        return false;
    }
}
2020-05-19