返回

如何准确地检测 .NET 中的 Windows 64 位平台?

windows

如何在 .NET 中检测 Windows 64 位平台?

作为一名 .NET 开发人员,了解如何检测目标操作系统的平台至关重要,尤其是当应用程序需要根据体系结构定制其行为时。传统的 System.Environment.OSVersion.Platform 方法在识别 Windows Vista 64 位时会出现混淆,因为它的输出是 "Win32NT",与 32 位操作系统相同。

检测 Windows 64 位平台的方法

为了准确检测 Windows 64 位平台,可以使用以下几种方法:

环境变量

Windows 提供了一个名为 PROCESSOR_ARCHITECTURE 的环境变量,用于指示处理器架构。对于 64 位平台,该变量的值为 "AMD64" 或 "x86_64"。

string envVar = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
bool is64Bit = envVar == "AMD64" || envVar == "x86_64";

WMI(Windows 管理规范)

WMI 提供了 Win32_OperatingSystem 类,其中包含有关操作系统的信息。查询此类可以获取平台信息:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
ManagementObjectCollection results = searcher.Get();
bool is64Bit = false;
foreach (ManagementObject result in results)
{
    string osName = result["Caption"].ToString();
    if (osName.Contains("64-bit"))
    {
        is64Bit = true;
    }
}

.NET API

.NET Framework 提供了 System.Runtime.InteropServices.RuntimeInformation 类,用于获取有关运行时环境的信息,包括 IsOSPlatform64Bit 属性:

bool is64Bit = RuntimeInformation.IsOSPlatform64Bit;

代码示例

以下示例代码演示了使用这些方法检测 Windows 64 位平台:

using System;
using System.Runtime.InteropServices;

namespace DetectWindows64Bit
{
    class Program
    {
        static void Main(string[] args)
        {
            // 环境变量
            string envVar = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            bool is64BitEnv = envVar == "AMD64" || envVar == "x86_64";

            // WMI
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectCollection results = searcher.Get();
            bool is64BitWmi = false;
            foreach (ManagementObject result in results)
            {
                string osName = result["Caption"].ToString();
                if (osName.Contains("64-bit"))
                {
                    is64BitWmi = true;
                }
            }

            // .NET API
            bool is64BitNet = RuntimeInformation.IsOSPlatform64Bit;

            Console.WriteLine(
using System;
using System.Runtime.InteropServices;

namespace DetectWindows64Bit
{
    class Program
    {
        static void Main(string[] args)
        {
            // 环境变量
            string envVar = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            bool is64BitEnv = envVar == "AMD64" || envVar == "x86_64";

            // WMI
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectCollection results = searcher.Get();
            bool is64BitWmi = false;
            foreach (ManagementObject result in results)
            {
                string osName = result["Caption"].ToString();
                if (osName.Contains("64-bit"))
                {
                    is64BitWmi = true;
                }
            }

            // .NET API
            bool is64BitNet = RuntimeInformation.IsOSPlatform64Bit;

            Console.WriteLine($"环境变量:{is64BitEnv}");
            Console.WriteLine($"WMI:{is64BitWmi}");
            Console.WriteLine(".NET API:{is64BitNet}");
        }
    }
}
quot;环境变量:{is64BitEnv}"
); Console.WriteLine(
using System;
using System.Runtime.InteropServices;

namespace DetectWindows64Bit
{
    class Program
    {
        static void Main(string[] args)
        {
            // 环境变量
            string envVar = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            bool is64BitEnv = envVar == "AMD64" || envVar == "x86_64";

            // WMI
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectCollection results = searcher.Get();
            bool is64BitWmi = false;
            foreach (ManagementObject result in results)
            {
                string osName = result["Caption"].ToString();
                if (osName.Contains("64-bit"))
                {
                    is64BitWmi = true;
                }
            }

            // .NET API
            bool is64BitNet = RuntimeInformation.IsOSPlatform64Bit;

            Console.WriteLine($"环境变量:{is64BitEnv}");
            Console.WriteLine($"WMI:{is64BitWmi}");
            Console.WriteLine(".NET API:{is64BitNet}");
        }
    }
}
quot;WMI:{is64BitWmi}"
); Console.WriteLine(".NET API:{is64BitNet}"); } } }

常见问题解答

  • 如何检测应用程序是否在 Windows 64 位上运行?
    可以使用相同的技术来检测运行时环境,无论应用程序是 32 位还是 64 位。

  • 环境变量方法在 Windows 10 上是否有效?
    是的,PROCESSOR_ARCHITECTURE 环境变量在所有 Windows 版本中都可用。

  • WMI 方法是否需要管理员权限?
    不,WMI 查询不需要管理员权限。

  • 为什么应用程序需要知道目标平台?
    了解目标平台可以帮助应用程序针对特定体系结构优化其性能、功能和资源使用情况。

  • 除了检测 64 位之外,还有其他检测平台的方法吗?
    是的,可以通过使用 System.Environment.Is64BitOperatingSystem 属性或 GetNativeSystemInfo API 检测 64 位和 32 位操作系统。