Как открыть раздел реестра WOW64 из 64-bit.NET применение

моему приложению .NET (any-CPU) необходимо прочитать значение реестра, созданное 32-разрядной программой. В 64-разрядной Windows это происходит под ключом Wow6432Node в реестре. Я читал, что вы не должны жестко кодировать Wow6432Node, так каков правильный способ доступа к нему с помощью .NET?

4 ответов


в случае, когда вам явно нужно прочитать значение, написанное 32-битной программой в 64-битной программе, это нормально для жесткого кода. Просто потому, что другого выхода нет.

Я бы, конечно, абстрагировал его от вспомогательной функции. Например

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


расширение ответа Андерса, есть хороший пример упаковки результирующего дескриптора в объект .NET RegistryKey в блоге Шахара Приша - обязательно прочитайте комментарии тоже.

обратите внимание, что неприкрашенное использование pinvoke.net обертка RegOpenKeyEx чревато проблемами.