Почему OpenSubKey () возвращает ноль в моей 64-битной системе Windows 7? - PullRequest
23 голосов
/ 17 марта 2010

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

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

Моя система разработки представляет собой 64-разрядную среду Windows 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-разрядных сред и должна знать, что нужно переходить на виртуальный узел.

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

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

Ответы [ 4 ]

22 голосов
/ 17 марта 2010

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

9 голосов
/ 22 мая 2013

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

RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = localMachine64.OpenSubKey(@"Software\MyCompany\MyApp\", false);
3 голосов
/ 17 февраля 2011

Да, у меня также есть такая же проблема с Windows 7 64-bit и Visual Studio 2008 SP1. Но мое решение противоположное, которое состоит в том, чтобы перейти с «x86» на «любой процессор» или «x64».

0 голосов
/ 08 сентября 2015

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

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

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

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

при проверке rsk.GetSubKeyNames ()

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

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

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

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

...