GetValue в Microsoft.Win32.Registry не использует значение по умолчанию - PullRequest
2 голосов
/ 07 октября 2011

У меня есть устаревшее (я его не создавал) приложение, работающее в среде x64 (Win7).У меня есть скрытое подозрение, что раньше он работал в 32-разрядной среде.

В любом случае, я вижу вызовы Registry.GetValue(key, value, default).

Кажется, значение по умолчанию игнорируется.

Проверьте этот сумасшедший код:

// Up above the sky, so high
using Microsoft.Win32;
// ...
string location = "HKEY_LOCAL_MACHINE\SOFTWARE\..."; // ...
// ...

string registryValue = (string)Registry.GetValue(location, "Uri", "http://localhost/");
if (string.isNullOrEmpty(registryValue) {
  throw new Exception("What the ... ?!");
}

В сопоставимом примере, исключение серьезно выбрасывается.(На самом деле, исключение нулевой ссылки появляется, несмотря на значение по умолчанию).

И я проверил, что у меня есть ключи реестра вплоть до последнего уровня;они все в моем реестре.

Это работает для кого-то , но не для меня.

Это ошибка?Что здесь происходит?

Ответы [ 4 ]

9 голосов
/ 07 октября 2011

Скорее всего, вы попали в перенаправление реестра . У вас есть 32-битный процесс, работающий в 64-битной системе. Таким образом, HKLM\Software перенаправляется на HKLM\Software\Wow6432Node.

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

Если имя не найдено в указанном ключе, возвращает заданное вами значение по умолчанию или ноль, если указанный ключ не существует.

2 голосов
/ 07 октября 2011

Значение по умолчанию возвращается только в том случае, если указан ключ (это первый параметр, т. Е. location в вашем примере) найден , но значение с указанным именем (второй параметр, "Uri" в вашем примере) не существует в этом ключе.

Если самого ключа не существует, возвращается ссылка null.

Это довольно хорошо задокументировано на MSDN .

Возможно, ключ, который вы ищете, не существует, возможно, потому что вы сейчас работаете в 64-битной среде, что означает, что в случае, если ваше приложение является 32-битным процессом, ключ HKLM\Software сопоставляется с HKLM\Software\Wow6432Node .

0 голосов
/ 04 ноября 2014

Я знаю, что это древнее, но в случае, если кто-то еще наткнется на эту проблему, я нашел подход, который хорошо работает для меня.Я использую OpenSubKey вместо GetValue.

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\MyProduct");
string data = key.GetValue("MyValue") as string;

Терминология реестра привела меня в замешательство.Это не просто ключ -> хранилище значений, это больше похоже на ключ -> значение -> данные.

0 голосов
/ 06 июля 2014

Понятия не имею почему, но я решил использовать

My.Computer.Registry.CurrentUser.GetValue("Software\Mykey","Default Value")
instead of
My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software","Mykey","Default Value")

Если ключ не существует, первый пример возвращает «Значение по умолчанию», второй - нулевой объект!

...