Вопрос по .net – Как открыть ключ реестра WOW64 из 64-разрядного приложения .NET

28

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

Ваш Ответ

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);
}
Что делать, если вы не можете перейти на 4.x? Используйте метод выше?
Это способ чтения реестра. WoW6432Node не должен читаться напрямую, так как Microsoft обрабатывает это через их API и заявляет, что это может измениться в будущем.
Это решение очень хорошо работает с моим модулем Win7 64bit +. Благодарю.
12

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

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

public RegistryKey GetSoftwareRoot() {
  var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node"
    : @"Software";
  return Registry.CurrentUser.OpenSubKey(path);
}
Достаточно справедливо - спасибо, Джаред! marijne
@Р. Bemrose, хммм -1 понижение за ответ, который был дан до того, как в RTM было выпущено критическое изменение. Почему бы просто не отредактировать ответ и добавить сноску?
Предупреждение: MS говорит, что этот подход (жесткое кодирование «Wow6432Node») не поддерживается. Увидетьmsdn.microsoft.com/en-us/library/aa384232(VS.85).aspx
-1: это поведение нарушается в Windows 7 / Windows Server 2008 R2, так как вместо этого они используют ключи общего реестра:msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx
@JaredPar Я думаю, что было бы разумно принизить ответы, которые со временем потеряли свою полезность. И этот рейтинг должен в конечном итоге отражать общую полезность ответа, а не его историю и родословную.
16

Правильным способом было бы вызвать API реестра и передатьKEY_WOW64_32KEY установить флажок для RegOpenKeyEx / RegCreateKeyEx

Следует отметить, что это решение действительно только при пинвокинге или использовании кода C ++.
@Zenox - это совершенно правильное решение, даже если вы используете такой язык, как C #, конечно, было бы глупо его использовать.
6

Расширяя ответ Андерса, естьхороший пример оборачивания полученного дескриптора в объекте .NET RegistryKey в блоге Shahar Prish - не забудьте прочитать комментарии, хотя.

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

Это отличное решение.

Похожие вопросы