2009-07-02 53 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); 
} 
相关问题