Как открыть ключ реестра WOW64 из 64-разрядного приложения.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 в блоге Shahar Prish - обязательно прочитайте также комментарии.

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

Другие вопросы по тегам