2009-07-02 51 views
27

我的.NET應用程序(any-CPU)需要讀取由32位程序創建的註冊表值。在64位Windows上,它位於註冊表中的Wow6432Node項下。我已經讀過,你不應該對Wow6432Node進行硬編碼,那麼用.NET訪問它的正確方法是什麼?如何從64位.NET應用程序中打開WOW64註冊表項

回答

12

如果您明確需要讀取64位程序中由32位程序寫入的值,則可以對其進行硬編碼。只是因爲沒有別的選擇。

我當然會將它抽象爲一個輔助函數。例如

public RegistryKey GetSoftwareRoot() { 
    var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node" 
    : @"Software"; 
    return Registry.CurrentUser.OpenSubKey(path); 
} 
+0

夠公平 - 謝謝Jared! – marijne 2009-07-02 14:01:41

+5

警告:MS不支持這種方法(對「Wow6432Node」進行硬編碼)。請參閱http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx – Richard 2009-07-30 17:23:32

+6

-1:此行爲在Windows 7/Windows Server 2008 R2中中斷,因爲它們使用共享註冊表鍵替代:http ://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx – Powerlord 2009-08-24 13:31:53

16

正確的方法是調用本機註冊表API和傳遞KEY_WOW64_32KEY標誌RegOpenKeyEx/RegCreateKeyEx

52

如果您可以將目標.Net版本更改爲v4,那麼您可以使用新的OpenBaseKey函數,例如

RegistryKey registryKey; 
if (Environment.Is64BitOperatingSystem == true) 
{ 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 
} 
else 
{ 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32); 
} 
相關問題