Ответ 1
Похоже, ваш проект компилируется до 64 бит. В настройках Compile
вашего проекта тестирования устройства установите "Целевой ЦП" на x86
(вместо AnyCPU
).
Устанавливает ли 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
.
Что мне делать?
Похоже, ваш проект компилируется до 64 бит. В настройках Compile
вашего проекта тестирования устройства установите "Целевой ЦП" на x86
(вместо AnyCPU
).
Если вам действительно нужно 32-битное приложение, вы можете получить доступ к 64-битным реестрам следующим образом:
RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = localMachine64.OpenSubKey(@"Software\MyCompany\MyApp\", false);
Да, у меня также такая же проблема с 64-разрядной версией Windows 7 и Visual Studio 2008 SP1. Но мое решение противоположное, это переход от "x86" к "Any CPU" или "x64".
Кому может относиться
В моем тесте, если вы используете AnyCpu для создания кода для работы с OpenSubKey и запускаете его на ОС x64, вы обнаружите, что не работаете над тем, что вы ожидаете.
Скажем, например: (Протестировано в .net 4.5.2)
RegistryKey rsk = Registry.LocalMachine.OpenSubKey("SOFTWARE");
когда вы проверяете rsk.GetSubKeyNames()
Я проверил это при отладке, результат не является ни HKLM, ни HKCU, по крайней мере, я не могу сказать, что это (очень похоже на HKCU, но не то же самое).
И самая известная проблема, которая может привести к этому:
DeleteSubKeyTree вызовет исключение аргумента. если вы попробуете открыть подраздел до удаления, это нормально, но когда вы делаете удаление, он скажет: "Эй, это не здесь...
Итак, будьте осторожны, теперь я больше никогда не буду использовать AnyCPU.