读取注册表值时崩溃
本文关键字:崩溃 注册表 读取 | 更新日期: 2023-09-27 18:30:04
无论我是否以管理员身份运行以下代码,都会失败:
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.
我知道这个值是存在的,它也包含数据。
*编辑:就像我说的,它不应该是空的,因为数据是存在的。如果它是空的,那么我需要知道它为什么是空的。因此,关于什么是System.NullReferenceException
的问题对我没有任何帮助。
正如raj在这个SO问题中指出的那样,问题可能是您在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);
使用"registry.LocalMachine"读取注册表可能不可靠,因为它默认为当前应用程序平台目标(x86/x64),并且当它是64位注册表时。LocalMachine可以查看注册表项,但无法访问其中的数据。
请尝试使用RegistryKey指定视图。
var stuff = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
.OpenSubKey("Software''Microsoft''CCM''LocationServices", true);
var value = stuff.GetValue("DnsSuffix").ToString();