我无法从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 ...

信息:
Bukkit GUI Project.exe中发生了类型为'System.NullReferenceException'的未处理异常

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

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

有什么帮助吗?

最佳答案

我可以看到几个问题。

首先,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

关于c# - 无法从现有 key 读取值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23199914/

10-12 18:44