我想从注册表中检索值。例如:HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer's name\Application name\InstallInfo
在'InstallInfo'下有很多变量,比如 ProductVersion,WebsiteDescription,WebSiteDirectory,CustomerName,WebSitePort等。
我想检索这些变量的一些值。我尝试了以下代码,但它返回
'对象引用未设置为对象'
的实例
var regKey = Registry.LocalMachine;
regKey = regKey.OpenSubKey(@"SOFTWARE\ABC Limited\ABC Application\InstallInfo");
if (regKey == null)
{
Console.WriteLine("Registry value not found !");
}
else
{
string dirInfo = (string)regKey.GetValue("WebSiteDirectory");
Console.Write("WebSiteDirectory: " + dirInfo);
}
Console.ReadKey();
答案 0 :(得分:5)
OpenSubKey
returns null
when it fails。这显然正是在这里发生的事情。
它失败了,因为你正在查看错误的根密钥。你正在寻找HKCU,但关键是HKLM。
所以你需要
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Manufacturer's name\Application name\InstallInfo");
致电OpenSubKey
时,您必须始终检查返回值。如果是null
则处理该错误情况。
if (regKey == null)
// handle error, raise exception etc.
要注意的另一件事是registry redirector。如果您的进程是在64位系统上运行的32位进程,那么您将看到注册表的32位视图。这意味着您查看HKLM\Softare
的尝试会被透明地重定向到HKLM\Software\Wow6432Node
。
答案 1 :(得分:1)
在将regKey.GetValue("WebSiteDirectory")
转换为字符串之前,您应该检查它是否为空,
if (regKey.GetValue("WebSiteDirectory")!=null)
//do the rest
答案 2 :(得分:0)
可能是因为您正在查看错误的根密钥。
应该是:
Registry.CurrentUser
而不是
Registry.LocalMachine
你走了:
Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Manufacturer's name\Application name\InstallInfo");