首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 登錄表遍歷:WOW6432Node 與標準路徑返回相同結果的原因

     編輯:程式設計疑難解答

現象描述

在 64 位元 Windows 系統上,使用 Registry.LocalMachine.OpenSubKey 分別開啟以下兩個路徑:

  • SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
  • Software\Microsoft\Windows\CurrentVersion\Uninstall

遍歷子鍵並讀取 DisplayName 時,獲得的軟體清單完全相同。

核心原因:登錄表重導向

64 位元 Windows 為了相容 32 位元應用程式,實作了**登錄表重導向**機制:

  • 32 位元進程 存取 HKLM\SOFTWARE\ 時,系統自動重導向至 HKLM\SOFTWARE\WOW6432Node\。
  • 64 位元進程 直接存取 HKLM\SOFTWARE\(即原生 64 位元視圖)。

若您的 C# 專案編譯目標為 x86 (Prefer 32-bit) 或強制 32 位元執行,兩次呼叫實際上都落在同一個 32 位元視圖,因此結果相同。

驗證與正確做法

  1. 檢查專案設定:專案屬性 → Build → 取消勾選 Prefer 32-bit,使程式以 64 位元執行。
  2. 明確指定視圖:使用 RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 取得 64 位元視圖,或 RegistryView.Registry32 取得 32 位元視圖。
// 明確讀取 64 位元視圖
using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (var subKey = baseKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
    foreach (var name in subKey.GetSubKeyNames())
    {
        using (var appKey = subKey.OpenSubKey(name))
        {
            var displayName = appKey?.GetValue("DisplayName")?.ToString();
            if (!string.IsNullOrEmpty(displayName)) Console.WriteLine(displayName);
        }
    }
}

總結

兩路徑返回相同結果是因為程式以 32 位元模式執行,觸發 WOW6432 重導向。生產代碼應明確指定 RegistryView,避免隱性重導向造成困惑。

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