首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

C# 判斷作業系統是 32 位還是 64 位的兩種方法

     編輯:Java 相關知識

前言

在 C# 開發中,有時需要根據作業系統的位元數(32 位或 64 位)執行不同的邏輯,例如載入對應的原生 DLL、設定登錄機碼或優化記憶體配置。本文介紹兩種常用且可靠的判斷方法,並說明各自的適用場景與注意事項。

方法一:透過 WMI 查詢 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。
    • 在 Guest 帳戶或無 WMI 權限環境下會拋出例外,需捕獲處理。
    • 查詢速度較慢(需啟動 WMI 服務)。

方法二:呼叫 Windows API 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。
    • 執行速度極快,幾乎無效能負擔。
    • 不受使用者權限限制,適用於各種執行環境。
  • 缺點:需正確宣告 P/Invoke 簽章,否則易發生堆疊不平衡錯誤。

總結與建議

場景建議方法
一般應用、高效能需求、低權限環境方法二 IsWow64Process
需同時取得 CPU 詳細規格(核心數、快取等)方法一 WMI 查詢

實務上,方法二為首選,因其輕量、穩健且相容性最佳。僅在需要完整硬體清查時,才考慮搭配 WMI 使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved