如何从注册表中检索值?

时间:2013-05-07 11:35:33

标签: c# registry

我想从注册表中检索值。例如:HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer's name\Application name\InstallInfo

在'InstallInfo'下有很多变量,比如 ProductVersion,WebsiteDescription,WebSiteDirectory,CustomerName,WebSitePort等。

我想检索这些变量的一些值。我尝试了以下代码,但它返回

  

'对象引用未设置为对象'

的实例
        var regKey = Registry.LocalMachine;

        regKey = regKey.OpenSubKey(@"SOFTWARE\ABC Limited\ABC Application\InstallInfo");

        if (regKey == null)
        {
           Console.WriteLine("Registry value not found !");
        }
        else
        {
            string dirInfo = (string)regKey.GetValue("WebSiteDirectory");
            Console.Write("WebSiteDirectory: " + dirInfo);
        }


        Console.ReadKey();

3 个答案:

答案 0 :(得分:5)

OpenSubKey returns null when it fails。这显然正是在这里发生的事情。

它失败了,因为你正在查看错误的根密钥。你正在寻找HKCU,但关键是HKLM。

所以你需要

RegistryKey regKey = Registry.LocalMachine.OpenSubKey(
    @"SOFTWARE\Manufacturer's name\Application name\InstallInfo");

致电OpenSubKey时,您必须始终检查返回值。如果是null则处理该错误情况。

if (regKey == null)
    // handle error, raise exception etc.

要注意的另一件事是registry redirector。如果您的进程是在64位系统上运行的32位进程,那么您将看到注册表的32位视图。这意味着您查看HKLM\Softare的尝试会被透明地重定向到HKLM\Software\Wow6432Node

答案 1 :(得分:1)

在将regKey.GetValue("WebSiteDirectory")转换为字符串之前,您应该检查它是否为空,

if (regKey.GetValue("WebSiteDirectory")!=null)
 //do the rest

答案 2 :(得分:0)

可能是因为您正在查看错误的根密钥。

应该是:

Registry.CurrentUser

而不是

Registry.LocalMachine

你走了:

Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Manufacturer's name\Application name\InstallInfo");