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

29

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

4个回答

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
这个解决方案在我的Win7 64位+单元测试中非常有效。谢谢。 - Jirapong
2
这是读取注册表的方法。WoW6432Node不应直接读取,因为Microsoft通过其API处理此操作,并表示将来可能会更改。 - Jason
如果你不能升级到4.x版本怎么办?使用上述方法吗? - Maury Markowitz

17

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


需要注意的是,此解决方案仅在使用pinvoke或C++代码时有效。 - Kyle
@Zenox - 即使在使用像C#这样的语言时,这仍然是一个完全有效的解决方案,但如果你使用它会很傻。 - Security Hound

13

如果你在64位程序中需要明确读取32位程序编写的值,硬编码是可以接受的。这是因为没有其他选择。

当然,我会将其抽象成一个帮助函数。例如

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

6
警告:微软表示,这种方法(将“Wow6432Node”硬编码)不受支持。请参阅http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx。 - Richard
6
这种行为在Windows 7/Windows Server 2008 R2中已经失效,因为它们使用共享注册表键:http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx - Powerlord
8
@R. Bemrose,哦,一条-1的踩票记录,但这个回答是在RTM发布之前就给出的。为什么不直接编辑回答并添加脚注呢? - JaredPar
2
@JaredPar 我认为,随着时间过去,对那些失去了实用性的回答进行负评是合理的。而且,这个评级应该最终反映出一个回答的普遍实用性,而不是它的历史和渊源。 - Tim Lovell-Smith

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接