2014-08-12 3 views
0

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

Исходный код:

RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey(regPath); 
string regValue1 = (string)regKey1.GetValue("CodeBase"); 

Это терпит неудачу, потому что regKey1 является null.

Возможная замена (это работает):

string regValue2 = (string)Registry.GetValue(Registry.LocalMachine.Name + regPath, "CodeBase", String.Empty); 

Согласно this post должен быть другой способ доступа к реестру, если программа составлена ​​для 32-битных и работает на 64-битной машине , Я использую 64-разрядную версию Windows 7, и программа компилируется для «Любой процессор». Однако, если это было причиной, я ожидал бы, что оба решения выше не сработают.

Может ли кто-нибудь объяснить разницу?

EDIT:

Обнаружена проблема.

regPath = @"\SOFTWARE\Wow6432Node\Classes\CLSID\ ..."; 

Из комментария Дэвид Heffernan Я изменил Registry.LocalMachine.Name + regPath в Path.Combine(Registry.LocalMachine.Name, regPath), но это не работает, чтобы начать с, потому что regPath начал с «\» (элементы не были объединены - без исключения). Тогда я понял, что OpenSubKey() также не нравится '\' в начале. После удаления этого из regPath обе версии работают одинаково. Спасибо Дэвиду и спасибо также за ваши предложения об использовании перечисления RegistryView.

+1

Не ответ на ваш вопрос, но предложение: вы действительно не должны скомпилировать исполняемые файлы для «Any CPU», но либо x86 OR amd64. Вы должны использовать «Любой процессор» только для библиотек классов. См. Http://blogs.msdn.com/b/rmbyers/archive/2009/06/09/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspx – chris

+1

'Path.Combine (Registry.LocalMachine.Name, regPath) 'является предпочтительным –

ответ

1

Version 1

Если ключ не существует, то regKey1 является null, и призыв к regKey1.GetValue() не может по той очевидной причине.

Version 2

Если ключ не существует, Registry.GetValue() возвращает null и regValue1 поэтому назначается null.


Что касается вопроса о представлениях реестра и AnyCPU, вы в настоящее время просите о проблемах. Предположительно, вы хотите посмотреть в определенном представлении реестра. Вы должны быть откровенно об этом, используя перечисление RegistryView.

+0

Спасибо за ваш ответ, но я проверил, и версия 2 вернула содержимое значения ключа правильно, это не пусто или пусто. – Ben

+0

Тогда, скорее всего, вы не сравнитесь, как с подобным. Итак, скорее всего, версия 1 работает как 32-битный процесс, а версия 2 - как 64-битный процесс. Или наоборот. Попробуйте запустить их один раз за другим в том же процессе. –

+0

Yup Я сделал это, вторая версия должна была сказать 'regValue2', извините за опечатку. Можете ли вы подробнее объяснить, как явно указать RegistryView, пожалуйста? – Ben

Смежные вопросы