如何从64位.NET应用程序中打开WOW64注册表项

时间:2009-07-02 13:42:37

标签: .net registry wow64

我的.NET应用程序(任何CPU)需要读取由32位程序创建的注册表值。在64位Windows上,这是在注册表中的Wow6432Node键下。我已经读过你不应该硬编码到Wow6432Node,那么用.NET访问它的正确方法是什么?

4 个答案:

答案 0 :(得分:54)

如果您可以将目标.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);
}

答案 1 :(得分:16)

正确的方法是调用本机注册表api并将KEY_WOW64_32KEY标志传递给RegOpenKeyEx / RegCreateKeyEx

答案 2 :(得分:12)

如果您明确需要在64位程序中读取由32位程序写入的值,则可以对其进行硬编码。仅仅因为没有其他选择。

我当然会将它抽象为辅助函数。例如

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

答案 3 :(得分:6)

扩展Anders的答案,有good example of wrapping the resulting handle in a .NET RegistryKey object on Shahar Prish's blog - 请务必阅读评论。

请注意,the pinvoke.net wrapper of RegOpenKeyEx的未经修饰的使用充满了问题。