我的.NET应用程序(任何CPU)需要读取由32位程序创建的注册表值。在64位Windows上,这将放在注册表中的Wow6432Node键下。我已经了解到不应该硬编码到Wow6432Node,那么使用.NET访问它的正确方法是什么?
如果你可以将目标 .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);
}
正确的方法是调用本地注册表API,并将KEY_WOW64_32KEY
标志传递给RegOpenKeyEx/RegCreateKeyEx
如果你在64位程序中需要明确读取32位程序编写的值,硬编码是可以接受的。这是因为没有其他选择。
当然,我会将其抽象成一个帮助函数。例如
public RegistryKey GetSoftwareRoot() {
var path = 8 == IntPtr.Size
? @"Software\Wow6432Node"
: @"Software";
return Registry.CurrentUser.OpenSubKey(path);
}
扩展Anders的答案,Shahar Prish的博客上有一个很好的示例,将结果句柄包装在.NET RegistryKey对象中 - 但一定要阅读评论。
请注意,直接使用RegOpenKeyEx的pinvoke.net包装器存在问题。