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

mar*_*jne 29 .net registry wow64

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

woa*_*any 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是阅读注册表的方法.不应该直接读取WoW6432Node,因为微软通过他们的API处理这个问题并且说它将来可能会改变. (2认同)

And*_*ers 16

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


Jar*_*Par 12

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

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

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

  • @R.Bemrose,嗯a -1 downvote得到一个答案,这是在RTM发布突破性变化之前给出的.为什么不编辑答案并添加脚注? (8认同)
  • 警告:MS说不支持这种方法(硬编码"Wow6432Node").见http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx (6认同)
  • -1:此行为在Windows 7/Windows Server 2008 R2中中断,因为它们使用共享注册表项:http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx (6认同)
  • @JaredPar我认为随着时间推移失去其实用性的答案是合理的.而这个评级最终应该反映答案的一般用处,而不是其历史和谱系. (2认同)

Rub*_*ink 6

扩展Anders的答案,有一个很好的例子,可以将结果句柄包装在Shahar Prish博客上的.NET RegistryKey对象中 - 请务必阅读这些评论.

请注意,RegOpenKeyEx的pinvoke.net包装器的未经修饰的使用 充满了问题.