C# 读取注册表 Key/Value,密钥始终为 NULL

C# Reading Registry Key/Value, Key is Always NULL

我在这里看到了几篇关于如何读取注册表键值的帖子,我认为我做的很好,但由于某种原因,我在我的案例中读取的键总是空的。

HKLM\SOFTWARE 中,我创建了密钥 MyCompany,然后在该密钥中,我创建了另一个密钥 MyApp,例如: HKLM\SOFTWARE\MyCompany\MyApp

在这个key里面,我添加了一个string字符串值"MySetting"

我正在尝试使用以下代码读取该值:

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyApp", false))
{
    string spaUrl = (String)key.GetValue("MySetting");
}

但是即使我在上面的位置设置了这些键和值,键也始终为空。知道我做错了什么吗?

我明白了

System.NullReferenceException was unhandled exception because key is always null.

解决方案

感谢 Luke Merrett 在下面的回答,我将密钥的位置修改为 HKLM\SOFTWARE\WOW6432Node 并且成功了。谢谢卢克

正如史蒂夫所说,这可能是 x86 与 x64 的问题。我在本地复制了您的代码,当 运行ning 在 x86 下时,我的密钥始终为空。将其更改为 x64 允许我访问密钥。

您可以在 Project Properties -> Build here 下更改目标:

There's some more detail on this here if you explicitly need an x86 key。或者,您可以 运行 %systemroot%\syswow64\regedit 添加和编辑 x86 密钥。

供参考;这既可以作为管理员使用,也可以作为标准用户使用 运行ning

我觉得这篇文章最好地回答了你的问题。 Reading 64bit Registry from a 32bit application

我遇到了一个问题,我必须 运行 32 位下的应用程序,而不是任何 CPU。因此,我一直得到 NULL,因为它找不到路径。 我创建了一个 IF/THEN 包装器以允许它确定要使用的密钥。

RegistryKey localMachine;
if (Directory.Exists("C:\Windows\SysWOW64"))
   { localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); }
else { localMachine = Registry.LocalMachine; }

string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products";
RegistryKey products = localMachine.OpenSubKey(productsRoot);
string[] productFolders = products.GetSubKeyNames();

这解决了我的问题并提供了灵活性。如果我只是 运行 在 "Any CPU" 下安装它,那不是问题。但是对于这个程序,我必须具体说明我在哪个 CPU 下运行,因为它的一个组件需要 运行 仅在 32 位模式下。

根据 Ros 的 Gressick 回答,最好检查你是否是 运行 一个 64bit32bit 应用程序,而不是仅仅检查你是否是运行 在 64 位上 os。

旁注:如果您使用 wix 设置注册表项,则需要以下代码段来获取正确的位置。

using (RegistryKey localMachine = Environment.Is64BitProcess
    ? RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    : Registry.LocalMachine)
{
    using (var key = localMachine.OpenSubKey("SOFTWARE\MyCompany\MyApp"))
    {
        if (key != null)
        {
            string project = (string) key.GetValue("PROJECT");
            if (!string.IsNullOrEmpty(project))
            {
                if (project.Contains("000984"))
                {
                    // do some project specific things here
                }
                else if(project.Contains("001065"))
                {
                    // do some project specific things here
                }
            }   
        }
    }
}