Вопрос: OpenSubKey не работает для значения реестра Мне нужно


У меня установлен SQL Server.

В реестре ключ MSSQLServer  в * HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft * выглядит так: enter image description here

Все следующие строки кода возвращают значения из реестра:

    var mainKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer");
    var subKey1 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("Client");
    var subKey2 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("MSSQLServer").OpenSubKey("CurrentVersion");

Однако этого не происходит:

var subKey3 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("Setup");

«Настройка» выглядит так же, как и другие клавиши. Любые мысли, почему эта команда возвращает null?


5


источник


Ответы:


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

К сожалению, API  для доступа к ключам реестра не позволяет 32-разрядному приложению получать 64-битное представление реестра.

Существует два варианта: Измените приложение на цель AnyCPU или x64 или P / Invoke  неуправляемый API. Эта  имеет пример того, как делать P / Invoke и MSDN  документация.

Кстати, вы можете передать путь к методу OpenSubKey, а не объединять их вместе.

Обновить : Я был не совсем прав. Начиная с .NET 4, OpenBaseKey метод ( MSDN ) можно использовать для получения 64-битного представления в 32-битном приложении.


10