29

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

4

4 回答 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);
}
于 2010-06-01T18:23:44.987 回答
16

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

于 2009-07-03T18:03:04.223 回答
12

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

我当然会把它抽象成一个辅助函数。例如

public RegistryKey GetSoftwareRoot() {
  var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node"
    : @"Software";
  return Registry.CurrentUser.OpenSubKey(path);
}
于 2009-07-02T13:47:49.793 回答
6

扩展安德斯的答案,在 Shahar Prish 的博客上有一个将生成的句柄包装在 .NET RegistryKey 对象中的很好的例子——不过请务必阅读评论。

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

于 2009-08-13T08:50:40.600 回答