在 64 位元 Windows 系統上,使用 Registry.LocalMachine.OpenSubKey 分別開啟以下兩個路徑:
SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Software\Microsoft\Windows\CurrentVersion\Uninstall遍歷子鍵並讀取 DisplayName 時,獲得的軟體清單完全相同。
64 位元 Windows 為了相容 32 位元應用程式,實作了**登錄表重導向**機制:
HKLM\SOFTWARE\ 時,系統自動重導向至 HKLM\SOFTWARE\WOW6432Node\。HKLM\SOFTWARE\(即原生 64 位元視圖)。若您的 C# 專案編譯目標為 x86 (Prefer 32-bit) 或強制 32 位元執行,兩次呼叫實際上都落在同一個 32 位元視圖,因此結果相同。
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,避免隱性重導向造成困惑。