我一直在尝试弄清为什么我无法访问注册表中的值。我最终提出了一个可能的解决方案,但我想知道为什么一个可行而另一个却不可行,以及我是否可以继续使用此解决方案。
原始代码:
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);
根据这篇文章,如果程序是针对32位编译的,并且在64位计算机上运行,则应该有另一种访问注册表的方式。我正在使用Windows 7的64位版本,并且正在为“任何CPU”编译该程序。但是,如果这是原因,那么我希望上述两种解决方案都将失败。
有人可以解释一下区别吗?
编辑:
找到了问题。
regPath = @"\SOFTWARE\Wow6432Node\Classes\CLSID\ ...";
由于David Heffernan的评论,我将其更改Registry.LocalMachine.Name + regPath
为Path.Combine(Registry.LocalMachine.Name, regPath)
,但是由于regPath以'\'开头(这些项没有合并-毫无例外),所以该命令一开始没有用。然后我意识到OpenSubKey()一开始也不喜欢'\'。从regPath删除此版本后,两个版本的工作原理相同。感谢David,也感谢您对使用RegistryView枚举的建议。
版本1
如果键不存在,regKey1
则为null
,并且regKey1.GetValue()
由于显而易见的原因,对的调用失败。
版本2
如果键不存在,则Registry.GetValue()
返回null
,并regValue1
因此被分配null
。
关于注册表视图和AnyCPU的问题,您目前正在寻求麻烦。大概是您要查看特定的注册表视图。通过使用RegistryView
枚举,您应该对此明确。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句