无论我是否以管理员身份运行,我的以下代码都会失败:
var suff = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\CCM\\LocationServices", true);
var value = suff.GetValue("DnsSuffix").ToString();
我收到此错误消息,我无法解码:
An unhandled exception of type 'System.NullReferenceException' occurred in MyApp.exe Additional information: Object reference not set to an instance of an object.
我知道这个值存在并且它也包含数据。
*编辑:就像我说的那样,由于数据存在,它不应该为空。如果它为null,那么我将需要知道为什么它为null。因此,关于什么是System.NullReferenceException
的问题根本无法帮助我。
答案 0 :(得分:3)
正如raj的答案在this SO question中指出的那样,与你的相似,问题可能是你在64位操作系统上打开了注册表。
尝试使用此方法(.NET 4.0或更高版本):
public class HKLMRegistryHelper
{
public static RegistryKey GetRegistryKey()
{
return GetRegistryKey(null);
}
public static RegistryKey GetRegistryKey(string keyPath)
{
RegistryKey localMachineRegistry = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32);
return string.IsNullOrEmpty(keyPath) ? localMachineRegistry : localMachineRegistry.OpenSubKey(keyPath);
}
public static object GetRegistryValue(string keyPath, string keyName)
{
RegistryKey registry = GetRegistryKey(keyPath);
return registry.GetValue(keyName);
}
}
...并将代码替换为:
string keyPath = @"SOFTWARE\Microsoft\CCM\LocationServices";
string keyName = "DnsSuffix";
var value = HKLMRegistryHelper.GetRegistryValue(keyPath, keyName);
答案 1 :(得分:0)
使用“Registry.LocalMachine”读取注册表可能不可靠,因为它默认为当前应用程序平台目标(x86 / x64),当它是64位时,Registry.LocalMachine可以查看密钥但无法访问其中的数据。 / p>
尝试使用RegistryKey指定视图。
var stuff = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
.OpenSubKey("Software\\Microsoft\\CCM\\LocationServices", true);
var value = stuff.GetValue("DnsSuffix").ToString();