C#读取注册表键/值,键始终为NULL

时间:2017-01-09 23:01:42

标签: c# registry registrykey

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

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

在这个键中,我添加了一个字符串字符串值"MySetting"

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

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

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

我得到了

  

System.NullReferenceException是未处理的异常,因为key始终为null。

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

3 个答案:

答案 0 :(得分:3)

我觉得这篇文章最能回答你的问题。 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();

这解决了我的问题并允许灵活性。如果我只是在"任何CPU"这不是一个问题。但是对于这个程序,我必须具体说明我在哪个CPU下操作,因为它的一个组件只需要在32位模式下运行。

答案 1 :(得分:2)

史蒂夫表示,这可能是x86与x64问题。我在本地重现了你的代码,当在x86下运行时,我的密钥总是为空。将其更改为x64允许我访问密钥。

您可以在“项目属性”下更改目标 - >在这里建立:

enter image description here

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

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

答案 2 :(得分:0)

根据Ross Gressick的回答,比仅检查您是否正在64位操作系统上运行,最好检查您是否正在运行64bit32bit应用程序。

旁注:如果您使用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
                }
            }   
        }
    }
}