C# 读取注册表值崩溃

C# 读取注册表值崩溃,c#,.net,registry,C#,.net,Registry,无论我是否以管理员身份运行,我的以下代码都会失败: var suff = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\CCM\\LocationServices", true); var value = suff.GetValue("DnsSuffix").ToString(); 我收到无法解码的错误消息: MyApp.exe中发生“System.NullReferenceException”类型的未处理异常。其他信息:对象引用

无论我是否以管理员身份运行,我的以下代码都会失败:

var suff = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\CCM\\LocationServices", true);
var value = suff.GetValue("DnsSuffix").ToString();
我收到无法解码的错误消息:

MyApp.exe中发生“System.NullReferenceException”类型的未处理异常。其他信息:对象引用未设置为对象的实例。

我知道这个值是存在的,它也包含数据


*编辑:就像我说的,它不应该是空的,因为数据存在。如果它是空的,那么我需要知道为什么它是空的。因此,关于什么是
System.NullReferenceException
的问题对我毫无帮助。

正如raj在中指出的,这与您的答案类似,问题可能是您在64位操作系统上打开注册表

请尝试此方法(.NET 4.0或更高版本):

。。。并将代码替换为:

string keyPath = @"SOFTWARE\Microsoft\CCM\LocationServices";
string keyName = "DnsSuffix";

var value = HKLMRegistryHelper.GetRegistryValue(keyPath, keyName);

正如raj在中的答案所指出的,这与您的答案类似,问题可能是您在64位操作系统上打开注册表

请尝试此方法(.NET 4.0或更高版本):

。。。并将代码替换为:

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();
使用“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();

可能重复@Dmitry,就像我说的,它不是空的。如果是,我也不知道为什么。所以我相信这个问题是正确的,我知道这个值是存在的,它也包含数据。你怎么知道的?当.NET应用程序在x64 CLR上运行时,您是否考虑过它可能是x86键(或者相反)?它在“正常”路径下和Wow6432Node下都存在。@Ian它没有任何区别。@Dmitry的可能重复项,就像我说的,它不是null。如果是,我也不知道为什么。所以我相信这个问题是正确的,我知道这个值是存在的,它也包含数据。你怎么知道的?当.NET应用程序在x64 CLR上运行时,您是否考虑过它可能是x86键(或者相反)?它既存在于“正常”路径下,也存在于Wow6432Node下。@Ian它没有任何区别。通常不赞成只链接的答案,即使它链接到另一个线程。你能在你的文章中加入代码的相关部分吗?谢谢你的输入!我正在更新我的答案。仅链接的答案通常不被接受,即使它链接到另一个线程。你能在你的文章中加入代码的相关部分吗?谢谢你的输入!我正在更新我的答案。