OpenSubKey不适用于我需要的注册表值

ray*_*ray 5 c#

我安装了SQL Server.

在注册表中,*HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft*中的密钥MSSQLServer如下所示: 在此输入图像描述

以下所有代码行都从注册表返回值:

    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");
Run Code Online (Sandbox Code Playgroud)

但是,这个没有:

var subKey3 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("Setup");
Run Code Online (Sandbox Code Playgroud)

"Setup"看起来与其他键的值相同.有什么想法为什么这个命令返回null?

Mik*_*ray 10

您的应用程序是32位,这是一个64位注册表项.32位和64位应用程序具有不同的注册表视图.在注册表中,您在代码中获得的密钥位于HKLM\Software\Wow6432Node\MSSQLServer,而不是HKLM\Software\MSSQLServer(在您的图片中).

遗憾的是,用于访问注册表项的托管API不允许32位应用程序获取注册表的64位视图.

有两个选项:将应用程序更改为目标AnyCPU或x64或P/Invoke非托管API.这有一个如何进行P/Invoke和MSDN文档的示例.

顺便说一句,您可以将路径传递给OpenSubKey方法,而不是像这样将它们链接在一起.

更新:我上面的说法不太正确.从.NET 4开始,该OpenBaseKey方法(MSDN)可用于在32位应用程序中获取64位视图.