在C#中读取注册表时的奇怪行为

可能重复:
C#WOW6432注册表节点搞乱了

这是代码:

var b1 = Registry.LocalMachine.OpenSubKey("software", true); var b2 = Registry.LocalMachine.OpenSubKey("software", true).OpenSubKey("company"); var r1 = Registry.LocalMachine.OpenSubKey("software").OpenSubKey("company").GetValueNames(); string resultString = Registry.LocalMachine.OpenSubKey("Software", true).CreateSubKey("company").GetValue(name).ToString(); 

我用name = "ApplicationDirectory"调用它。 在最后一行,前两个变量指向正确的位置(基于其Name属性)。 问题在于r1 ,它不列出HKEY_LOCAL_MACHINE\SOFTWARE\company的内容,而是列出HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\company 。 为什么是这样? 这是64位机器中的一些重定向吗?

是的,在64位计算机上有32位应用程序的重定向。 查看关于您的问题的评论,以及这个SO答案 。

如果您的目标是.Net 4或更高版本,您将能够访问Wow6432Node (用于32位应用程序)和“标准”节点(用于64位应用程序的节点),因为RegistryKey.OpenBaseKey方法提供了参数键入RegistryView ,允许选择要使用的正确节点。

如果您使用的是.Net 3.5或以前的版本,那么如果您希望能够在64位计算机上读取32/64位注册表项,则必须使用P / Invoke。 您必须使用RegOpenKeyEx并将KEY_WOW64_32KEY指定为所需访问的标志。 但这是另一个故事,超出了你的问题的范围。