我的.NET应用程序(任何-CPU)需要读取由一个32位的程序创建的注册表值。在64位Windows这正好在注册表中Wow6432Node项下。我看了,你不应该硬编码到Wow6432Node,所以有什么用.NET来访问它的正确方法?

有帮助吗?

解决方案

在这里显式需要在一个64位的程序来读取由一个32位的程序写入一个值的情况下,这是行向硬编码。很简单,因为实在是没有其他的选择。

我当然抽象出来到一个辅助功能。例如

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

其他提示

如果可以改变所述目标.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

扩展的Anders的回答,有一个缠绕所得的很好的例子在沙哈尔Prish的博客一个.NET的RegistryKey对象句柄 - 一定要过,虽然阅读注释

请注意rel="noreferrer"> RegOpenKeyEx 的pinvoke.net包装,坦率使用

scroll top