c# - 无法从现有键中读取值

标签 c# registry registrykey

我无法从注册键中读取值.. 出于某种奇怪的原因。路径是正确的..并且 key 存在。我不知道为什么它无法读取它。

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

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...

留言: The Bukkit GUI Project.exe 中发生类型为“System.NullReferenceException”的未处理异常

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

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

有什么帮助吗?

最佳答案

我能看到几个问题。

首先,readReg 实际上是在 Registry.CurrentUser 上调用 OpenSubKey。从 HKCU 读取。您需要为 HKLM 使用 Registry.LocalMachine。将根 key 作为额外参数传递给 readReg

最重要的是,您可能会被 registry redirector 捕获.您的 32 位进程(好吧,我假设您的进程是 32 位的)被重定向到注册表的 32 位 View 。但您要查找的 key 位于注册表的 64 位 View 中。

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

使用 RegistryView枚举以允许您的 32 位进程访问注册表的 64 位 View 。


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

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

相关文章:

C# - 文件关联对注册表项 'HKEY_CLASSES_ROOT\' 的访问被拒绝

windows - 有没有办法查看谁修改了注册表?

xml - WiX RemoveRegistryKey 元素的行为与广告不符

windows - 使用批处理脚本在 Windows 中添加注册表项,并在数据中添加引号

C++ 为什么我的代码将注册表项放在错误的目录中?

registry - 如果没有管理员权限,您可以获得哪些注册表访问权限?

c# - 使用 MVC 上传和处理多个文件

c# - C# 3.5 中的异步编程

c# - 寻找最长的子串正则表达式?

c# - T4 在项目之间复制枚举