Я пытался выяснить, почему я не могу получить доступ к значению в реестре. Я закончил с возможным решением, но я хотел бы знать, почему он работает, а другой нет, и если я могу пойти дальше и использовать это решение.Значение реестра Доступ
Исходный код:
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.
Не ответ на ваш вопрос, но предложение: вы действительно не должны скомпилировать исполняемые файлы для «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
'Path.Combine (Registry.LocalMachine.Name, regPath) 'является предпочтительным –