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 回答,最好检查你是否是 运行 一个 64bit
或 32bit
应用程序,而不是仅仅检查你是否是运行 在 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
}
}
}
}
}
我在这里看到了几篇关于如何读取注册表键值的帖子,我认为我做的很好,但由于某种原因,我在我的案例中读取的键总是空的。
在 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 回答,最好检查你是否是 运行 一个 64bit
或 32bit
应用程序,而不是仅仅检查你是否是运行 在 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
}
}
}
}
}