C # WOW6432 узел реестра беспорядочно - PullRequest
4 голосов
/ 22 января 2012

Попытка выполнить простую задачу записи в реестр, чтобы приложение C # работало при запуске.

Используя базовую настройку Win32.RegistryKey, но по какой-то причине он продолжает добавлять мои ключи в каталог /SOFTWARE/WOW6432/Microsoft/Windows.. и т. Д. Вместо простого ol /SOFTWARE/Microsoft/Windows..

Пытался немного почитать, но на этот вопрос не было простого ответа: Как конкретно записать ключ в ключ реестра /SOFTWARE/Microsoft/Windows вместо записи в WOW6432? Я проверил, чтобы в моем файле решения Visual C # Express была указана платформа x86 ... поэтому он компилируется правильно ... Мне просто не нужен этот каталог wow6432.

Спасибо за любой совет!

Edit:

Я сейчас использую следующее, но все еще безуспешно:

Microsoft.Win32.RegistryKey localKey32 = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64);

Ответы [ 4 ]

6 голосов
/ 22 января 2012

Ваш процесс нацелен на x86 (т.е. это 32-битный процесс), и при запуске на 64-битной машине под эмулятором WOW64 перенаправление реестра вступает в игру.Для определенных частей реестра система поддерживает два разных представления: одно для 32-битных процессов и одно для 64-битных процессов.Список ключей, на которые влияет перенаправление, приведен здесь: Ключи реестра, на которые влияет WOW64 .

Перенаправление прозрачно для приложения.32-битный процесс обращается к HKLM\Software и не знает (на самом деле не должен знать), что 64-битная ОС фактически обращается к HKLM\Software\Wow6432Node.

У вас есть ряд доступных вам опций:

  1. Переключитесь на цель AnyCPU, чтобы ваш процесс работал как 32-битный или 64-битный в зависимости от базовой ОС.Это неудобно в версии Express, поскольку целевая платформа не может быть указана в IDE.
  2. Явно откройте 64-битное представление реестра.В .net для этого требуется перечисление RegistryView.Однако обратите внимание, что для этой функции требуется .net 4, а для более ранних версий .net требуется p / invoke, чтобы открыть представления реестра.
  3. Продолжить работу с x86 и выполнить запись в HKLM\Software.64-разрядная система будет считывать оба представления реестра при обработке разделов реестра при запуске.Другими словами, ваш существующий подход уже работает!

В заключение я хотел бы прокомментировать, что задачу настройки этого раздела реестра лучше оставить программе установки.Для изменения ключей в HKLM\Software требуются права администратора, и обычно вы можете ожидать, что у вас есть права администратора только во время установки.

3 голосов
/ 22 января 2012

Попробуйте явно открыть реестр в 64 bit представлении, используя Registry64 в RegistryView .Точно так же вы можете открыть 32 bit представление, используя Registry32 параметр

В соответствии с MSDN

Вы можете указать представление реестра при использовании OpenBaseKey и OpenRemoteBaseKey (RegistryHive, String, RegistryView) и свойство FromHandle объекта RegistryKey.

0 голосов
/ 22 января 2012

Виноват не C #, а вообще 64-битная Windows.

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

См. Перенаправитель реестра , MSDN и Поддержка KB .

0 голосов
/ 22 января 2012

Убедитесь, что ваша платформа C # - x64. Потому что HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node - это HKEY_LOCAL_MACHINE\SOFTWARE для x86 приложений в x64 ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...