Доступ к реестру Windows в C#

Я пытаюсь установить все экземпляры SQL на локальном компьютере с помощью следующего кода:

RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server");
string[] instances = (string[])rk.GetValue("InstalledInstances");

if (instances.Length > 0)    //Error
{
    foreach (string instance in instances)
    {
        MessageBox.Show(instance);
    }
}

Это дает следующее исключение:

В экземпляре объекта не задана ссылка на объект.

Я вручную проверил «Редактор реестра», и указанные ключи существуют, также в моей системе есть два экземпляра SQL.

Теперь, пожалуйста, скажите мне, почему он не получает доступ к требуемому значению ключа?


person Muhammad Ali    schedule 06.07.2012    source источник
comment
Я предсказываю, что вы используете 32-битный код в 64-битной ОС.   -  person SLaks    schedule 06.07.2012
comment
См. этот SO Question   -  person Mark Hall    schedule 06.07.2012
comment
Но InstalledInstances не существует под ключом Microsoft SQL Server.   -  person Muhammad Ali    schedule 06.07.2012
comment
Возможно, вам потребуется запустить код с повышенными привилегиями.   -  person Icemanind    schedule 06.07.2012


Ответы (2)


Я запустил ваш код на своей 64-битной машине. Это работало нормально. Убедитесь, что ваша платформа настроена на AnyCPU или x64, но не на x86.

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

person Harvey Kwok    schedule 06.07.2012

Эта строка может быть строкой [] instances = (string[])rk.GetValue("InstalledInstances");

Поскольку метод RegistryKey.GetValue (String) возвращает объект, и вы приводите его к строке []

перед приведением его к строке [] вы должны проверить, не является ли возвращаемое значение нулевым

person HatSoft    schedule 06.07.2012
comment
Я не думаю, что этот ответ правильный, потому что, если GetValue вернет null, то приведение к строке [] вызовет ошибку, поскольку вы не можете преобразовать нулевое значение в массив строк. Его ошибка, похоже, возникает после этого, что говорит мне о том, что он не возвращает значение null и успешно приводит к массиву строк. - person Icemanind; 06.07.2012