无法从现有密钥中读取值

时间:2014-04-21 14:58:58

标签: c# registry registrykey

我无法从reg键读取值。出于某种奇怪的原因。路径是正确的..关键存在。我不知道它为什么无法阅读它。

我有一些代码(读取注册表)

string local  = Microsoft.Win32.Registry.LocalMachine.ToString();
        string javaRegPath = "\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
        if (javaRegPath != null)
        {
            string javaVersion = Registry.readReg(local + javaRegPath, "CurrentVersion").ToString();
            string javaHome = Registry.readReg(javaRegPath + "\\" + javaVersion, "JavaHome").ToString();
            return javaHome;
        }

Registry.cs(阅读)

public static object readReg(string keyPath, string keyName)
    {
        key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(keyPath);
        return  key.GetValue(keyName);
    }

这是注册表编辑器中的图像。验证路径等。 registry http://bumisworld.eu/reg.png

但它只是返回一个NPE ......

消息: 类型' System.NullReferenceException'的未处理异常发生在Bukkit GUI Project.exe

附加信息:未将对象引用设置为对象的实例。

registry http://bumisworld.eu/locals2.png

对此有何帮助?

1 个答案:

答案 0 :(得分:4)

我可以看到几个问题。

首先,readReg实际上是在OpenSubKey上调用Registry.CurrentUser。该内容来自HKCU。您需要Registry.LocalMachine使用HKLM。将根密钥作为额外参数传递给readReg

最重要的是,你可能会被registry redirector抓住。您的32位进程(我假设您的进程是32位)被重定向到注册表的32位视图。但是你要找的关键是注册表的64位视图。

换句话说,您访问HKLM\Software的尝试被重定向到HKLM\Software\Wow6432Node

使用RegistryView枚举允许32位进程访问注册表的64位视图。


还应修改您的readReg功能,以检查对OpenSubKey的调用中的错误。该方法可以返回null。您应该以更干净的方式处理该场景,然后抛出NullReferenceException