5

我已经安装了 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");

但是,这个没有:

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

“设置”看起来与其他键的值类型相同。任何想法为什么这个命令返回null?

4

1 回答 1

10

您的应用程序是 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 ) 可用于在 32 位应用程序中获取 64 位视图。

于 2012-06-06T17:54:24.240 回答