C # Чтение ключа / значения реестра, ключ всегда равен NULL

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

В HKLM\SOFTWARE я создал ключ MyCompany, а затем внутри этого ключа я создал еще один ключ MyApp, например: HKLM\SOFTWARE\MyCompany\MyApp

В этом ключе я добавил строковое строковое значение "MySetting"

Я пытаюсь прочитать это значение, используя следующий код:

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyApp", false))
{
    string spaUrl = (String)key.GetValue("MySetting");
}

но ключ всегда равен нулю, даже если эти ключи и значение установлены в указанном выше месте. Есть идеи, что я делаю не так?

я получил

System.NullReferenceException было необработанным исключением, поскольку ключ всегда имеет значение NULL.

РЕШЕНИЕ

Благодаря ответу Люка Мерретта ниже, я изменил расположение своих ключей на HKLM\SOFTWARE\WOW6432Node, и это сработало. Спасибо, Люк


person cd491415    schedule 09.01.2017    source источник
comment
У вас есть разрешение на чтение раздела реестра?   -  person Mike Dinescu    schedule 10.01.2017
comment
Я не знаю. Как мне понять это и получить разрешение?   -  person cd491415    schedule 10.01.2017
comment
Самый простой способ определить, является ли это проблемой, - запустить приложение от имени администратора. Если запуск таким образом завершился успешно, то, скорее всего, проблема в разрешениях. В этом случае вам необходимо убедиться, что участник, работающий с приложением, имеет разрешения на чтение определенного ключа реестра.   -  person Mike Dinescu    schedule 10.01.2017
comment
Я запускаю приложение в режиме отладки из VS, запущенного как администратор   -  person cd491415    schedule 10.01.2017
comment
Ваше приложение 32-битное или 64-битное?   -  person Steve    schedule 10.01.2017
comment
это на самом деле добавить его в Outlook, и он 64-битный, Windows 10   -  person cd491415    schedule 10.01.2017


Ответы (3)


Как указал Стив, это может быть проблема x86 против x64. Я воспроизвел ваш код локально, и при работе под x86 мой ключ всегда был нулевым. Изменение его на x64 позволило мне получить доступ к ключу.

Вы можете изменить цель в Project Properties -> Build здесь:

введите описание изображения здесь

Подробнее об этом здесь если вам явно нужен ключ x86. В качестве альтернативы вы можете запустить %systemroot%\syswow64\regedit, чтобы добавлять и редактировать ключи x86.

Для справки; это работает как администратор, так и как стандартный пользователь

person Luke Merrett    schedule 09.01.2017
comment
Целью платформы в моем случае является AnyCPU - person cd491415; 10.01.2017
comment
Спасибо, Люк. Я переместил свой раздел реестра в HKLM \ SOFTWARE \ WOW6432Node \ MyCompany \ MyApp, и это сработало. Думаю, ваш ответ привел меня к решению. Спасибо ~ - person cd491415; 10.01.2017

Я считаю, что эта статья лучше всего отвечает на ваш вопрос. Чтение 64-битного реестра из 32-битного приложения

У меня была проблема, когда мне приходилось запускать приложение на 32-битной версии, а не на любом процессоре. Из-за этого я продолжал получать NULL, потому что он не мог найти путь. Я создал оболочку IF / THEN, чтобы она могла определять, какой ключ использовать.

RegistryKey localMachine;
if (Directory.Exists("C:\\Windows\\SysWOW64"))
   { localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); }
else { localMachine = Registry.LocalMachine; }

string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products";
RegistryKey products = localMachine.OpenSubKey(productsRoot);
string[] productFolders = products.GetSubKeyNames();

Это решило мою проблему и обеспечило гибкость. ЕСЛИ я просто запускал его под «Any CPU», это не было проблемой. Но для этой программы мне пришлось указать, с каким процессором я работал, потому что ее компонент должен был работать только в 32-битном режиме.

person Ross Gressick    schedule 02.05.2017

Основываясь на ответе Росс Грессик, лучше проверить, используете ли вы приложение 64bit или 32bit, чем просто проверять, работаете ли вы на 64-битной ОС.

Боковое примечание: если вы используете wix для установки ключей реестра, вам понадобится следующий фрагмент, чтобы указать правильное расположение.

using (RegistryKey localMachine = Environment.Is64BitProcess
    ? RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    : Registry.LocalMachine)
{
    using (var key = localMachine.OpenSubKey("SOFTWARE\\MyCompany\\MyApp"))
    {
        if (key != null)
        {
            string project = (string) key.GetValue("PROJECT");
            if (!string.IsNullOrEmpty(project))
            {
                if (project.Contains("000984"))
                {
                    // do some project specific things here
                }
                else if(project.Contains("001065"))
                {
                    // do some project specific things here
                }
            }   
        }
    }
}
person Dominic Jonas    schedule 19.02.2019