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

时间:2012-01-24 11:46:53

标签: c# .net registry

  

可能重复:
  C# WOW6432 registry node messin things up

这是代码:

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位机器中的一些重定向吗?

1 个答案:

答案 0 :(得分:2)

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

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

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