Подтвердить что ты не робот

Почему OpenSubKey() возвращает null в мою 64-разрядную систему Windows 7?

Устанавливает ли OpenSubKey() и другие функции реестра Microsoft.Win32 значение null в 64-разрядных системах, когда 32-разрядные разделы реестра находятся под Wow6432node в реестре?

Я работаю над модульной структурой тестирования, которая вызывает вызов OpenSubKey() из библиотеки .NET.

Моя система разработки представляет собой 64-битную среду Windows и nbsp; 7 с Visual Studio 2008 SP1 и установленный Windows 7 SDK.

Приложение, которое мы тестируем, представляет собой 32-разрядное приложение, поэтому реестр виртуализирован под HKLM\Software\Wow6432node. Когда мы вызываем:

Registry.LocalMachine.OpenSubKey( @"Software\MyCompany\MyApp\" );

Возвращается нуль, однако явно указано, что здесь работает:

Registry.LocalMachine.OpenSubKey( @"Software\Wow6432node\MyCompany\MyApp\" );

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

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

Что мне делать?

4b9b3361

Ответ 1

Похоже, ваш проект компилируется до 64 бит. В настройках Compile вашего проекта тестирования устройства установите "Целевой ЦП" на x86 (вместо AnyCPU).

Ответ 2

Если вам действительно нужно 32-битное приложение, вы можете получить доступ к 64-битным реестрам следующим образом:

RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = localMachine64.OpenSubKey(@"Software\MyCompany\MyApp\", false);

Ответ 3

Да, у меня также такая же проблема с 64-разрядной версией Windows 7 и Visual Studio 2008 SP1. Но мое решение противоположное, это переход от "x86" к "Any CPU" или "x64".

Ответ 4

Кому может относиться

В моем тесте, если вы используете AnyCpu для создания кода для работы с OpenSubKey и запускаете его на ОС x64, вы обнаружите, что не работаете над тем, что вы ожидаете.

Скажем, например: (Протестировано в .net 4.5.2)

RegistryKey rsk = Registry.LocalMachine.OpenSubKey("SOFTWARE"); 

когда вы проверяете rsk.GetSubKeyNames()

Я проверил это при отладке, результат не является ни HKLM, ни HKCU, по крайней мере, я не могу сказать, что это (очень похоже на HKCU, но не то же самое).

И самая известная проблема, которая может привести к этому:

DeleteSubKeyTree вызовет исключение аргумента. если вы попробуете открыть подраздел до удаления, это нормально, но когда вы делаете удаление, он скажет: "Эй, это не здесь...

Итак, будьте осторожны, теперь я больше никогда не буду использовать AnyCPU.