Как открыть ключ реестра 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 чревато проблемами.