C# 注册表值访问

C# 注册表值访问,c#,registry,C#,Registry,我一直在试图找出为什么我不能访问注册表中的值。我最终找到了一个可能的解决方案,但我想知道为什么一个可行,另一个不行,以及我是否可以继续使用这个解决方案 原代码: RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey(regPath); string regValue1 = (string)regKey1.GetValue("CodeBase"); 此操作失败,因为regKey1为null 可能的更换(本工程): 根据这项研究,如果程序编译

我一直在试图找出为什么我不能访问注册表中的值。我最终找到了一个可能的解决方案,但我想知道为什么一个可行,另一个不行,以及我是否可以继续使用这个解决方案

原代码:

RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey(regPath);
string regValue1 = (string)regKey1.GetValue("CodeBase");
此操作失败,因为regKey1为
null

可能的更换(本工程):

根据这项研究,如果程序编译为32位并且运行在64位机器上,那么应该有一种不同的访问注册表的方法。我使用的是64位版本的Windows7,该程序正在为“任何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
枚举来明确这一点。

这不是对您的问题的回答,而是一个建议:您确实不应该为“任何CPU”编译可执行文件,而是x86或amd64。您应该仅对类库使用“任何CPU”。请参阅
Path.Combine(Registry.LocalMachine.Name,regPath)
是首选。谢谢您的回答,但我检查了,版本2正确返回键值的内容,它不是null或空的。那么很可能是您没有将like与like进行比较。因此,最有可能的版本1作为32位进程运行,而版本2作为64位进程运行。反之亦然。试着在同一个过程中一个接一个地运行它们。是的,我这样做了,第二个版本应该说
regValue2
,很抱歉输入错误。请您进一步解释如何显式指定RegistryView好吗?
RegistryView
的MSDN文档在我的视图中非常清楚:您可以在使用OpenBaseKey和OpenRemoteBaseKey(RegistryHive,String,RegistryView)方法时指定注册表视图,以及RegistryKey对象的FromHandle属性。在您的情况下,您将使用
OpenBaseKey
regPath = @"\SOFTWARE\Wow6432Node\Classes\CLSID\ ...";