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

2024-04-30

我安装了 SQL Server。

In the registry, the key MSSQLServer at *HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft* looks like this: 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");

“Setup”看起来与其他键具有相同类型的值。有什么想法为什么这个命令返回 null 吗?


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

不幸的是,托管API http://en.wikipedia.org/wiki/Application_programming_interface用于访问注册表项不允许 32 位应用程序获取注册表的 64 位视图。

有两个选项: 将您的应用程序更改为目标 AnyCPU 或 x64,或者P/Invoke http://en.wikipedia.org/wiki/Platform_Invocation_Services非托管 API。This http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx有一个关于如何执行 P/Invoke 和MSDN http://msdn.microsoft.com/en-us/library/aa384129%28v=vs.85%29.aspx文档。

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

Update: 上面我说的不太对。从 .NET 4 开始,OpenBaseKey方法 (MSDN http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx) 可用于在 32 位应用程序中获取 64 位视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenSubKey 不适用于我需要的注册表值 的相关文章

随机推荐