在 C# 開發中,有時需要根據作業系統的位元數(32 位或 64 位)執行不同的邏輯,例如載入對應的原生 DLL、設定登錄機碼或優化記憶體配置。本文介紹兩種常用且可靠的判斷方法,並說明各自的適用場景與注意事項。
Win32_Processor 的 AddressWidth此方法利用 System.Management 命名空間查詢處理器資訊。AddressWidth 屬性直接回傳處理器的位址寬度(32 或 64)。
using System;
using System.Management;
public static class OsHelper
{
public static int GetOSBit()
{
try
{
var options = new ConnectionOptions();
var scope = new ManagementScope(@"\\localhost", options);
var query = new ObjectQuery("SELECT AddressWidth FROM Win32_Processor");
var searcher = new ManagementObjectSearcher(scope, query);
var collection = searcher.Get();
foreach (ManagementObject obj in collection)
{
string width = obj["AddressWidth"]?.ToString();
if (int.TryParse(width, out int bit))
return bit;
}
}
catch (Exception)
{
// 忽略例外,回傳預設值
}
return 32; // 預設視為 32 位
}
}
System.Management.dll。IsWow64Process(推薦)此方法透過 P/Invoke 呼叫 kernel32.dll 的 IsWow64Process 函式,判斷目前行程是否運行在 WOW64 子系統下(即 64 位 Windows 上執行 32 位行程)。
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public static class OsHelper
{
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);
public static bool Is64BitOperatingSystem()
{
if (IntPtr.Size == 8) // 64 位行程必定運行在 64 位 OS
return true;
// 32 位行程需進一步檢查
bool isWow64;
if (IsWow64Process(Process.GetCurrentProcess().Handle, out isWow64))
return isWow64;
return false; // API 呼叫失敗視為 32 位
}
}
System.Diagnostics 與 System.Runtime.InteropServices。| 場景 | 建議方法 |
|---|---|
| 一般應用、高效能需求、低權限環境 | 方法二 IsWow64Process |
| 需同時取得 CPU 詳細規格(核心數、快取等) | 方法一 WMI 查詢 |
實務上,方法二為首選,因其輕量、穩健且相容性最佳。僅在需要完整硬體清查時,才考慮搭配 WMI 使用。