注册表值访问

时间:2014-08-12 13:38:27

标签: c# registry

我一直试图解决为什么我无法访问注册表中的值。我最终得到了一个可能的解决方案,但我想知道为什么一个有效,另一个没有,如果我可以继续使用这个解决方案。

原始代码:

RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey(regPath);
string regValue1 = (string)regKey1.GetValue("CodeBase");

此操作失败,因为regKey1为null

可能的替代品(这有效):

string regValue2 = (string)Registry.GetValue(Registry.LocalMachine.Name + regPath, "CodeBase", String.Empty);

根据this post,如果程序是针对32位编译的并且在64位计算机上运行,​​则应该有一种不同的方式来访问注册表。我使用的是64位版本的Windows 7,该程序正在为“任何CPU”编译。但是,如果这是原因,那么我希望上述两种解决方案都失败。

有人可以解释一下这个区别吗?

编辑:

发现问题。

regPath = @"\SOFTWARE\Wow6432Node\Classes\CLSID\ ...";

由于David Heffernan的评论,我将Registry.LocalMachine.Name + regPath更改为Path.Combine(Registry.LocalMachine.Name, regPath),但这并不起作用,因为regPath以'\'开头(项目未合并 - 没有例外)。然后我意识到OpenSubKey()在开始时也不喜欢'\'。从regPath中删除它后,两个版本的工作方式相同。感谢David,感谢您对使用RegistryView枚举的建议。

1 个答案:

答案 0 :(得分:1)

版本1

如果该密钥不存在,则regKey1null,并且regKey1.GetValue()的调用因显而易见原因而失败。

版本2

如果密钥不存在,则Registry.GetValue()会返回null,因此会为regValue1分配null


关于注册表视图和AnyCPU的问题,您目前要求麻烦。大概你的意思是查看特定的注册表视图。您应该使用RegistryView枚举来明确这一点。