我一直试图解决为什么我无法访问注册表中的值。我最终得到了一个可能的解决方案,但我想知道为什么一个有效,另一个没有,如果我可以继续使用这个解决方案。
原始代码:
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枚举的建议。
答案 0 :(得分:1)
版本1
如果该密钥不存在,则regKey1
为null
,并且regKey1.GetValue()
的调用因显而易见原因而失败。
版本2
如果密钥不存在,则Registry.GetValue()
会返回null
,因此会为regValue1
分配null
。
关于注册表视图和AnyCPU的问题,您目前要求麻烦。大概你的意思是查看特定的注册表视图。您应该使用RegistryView
枚举来明确这一点。