C#WOW6432注册表节点搞乱了

时间:2012-01-22 08:44:39

标签: c# windows winapi registry

尝试执行写入注册表的简单任务,以便在启动时运行C#应用程序。

使用基本的Win32.RegistryKey设置,但出于某种原因,它会将我的密钥添加到/SOFTWARE/WOW6432/Microsoft/Windows.. etc目录而不是普通的/SOFTWARE/Microsoft/Windows..

尝试阅读一下,但这个问题似乎没有一个简单的答案: 如何专门为/SOFTWARE/Microsoft/Windows注册表项编写密钥而不是写入WOW6432?我已经检查过以确保我的Visual C#Express解决方案文件将平台列为x86 ...所以它正在正确编译...我只是不想要wow6432目录。

感谢您的任何建议!

编辑:

我现在使用以下内容但仍然没有成功:

Microsoft.Win32.RegistryKey localKey32 = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64);

4 个答案:

答案 0 :(得分:6)

您的进程以x86为目标(即它是一个32位进程),当在WOW64仿真器下的64位计算机上运行时,registry redirection开始运行。对于注册表的某些部分,系统维护两个不同的视图,一个用于32位进程,另一个用于64位进程。受重定向影响的密钥列表位于:Registry Keys Affected by WOW64

重定向对应用程序是透明的。 32位进程访问HKLM\Software并且不知道(实际上不需要知道)64位操作系统实际访问HKLM\Software\Wow6432Node

您可以使用多种选项:

  1. 切换到AnyCPU目标,以便您的进程将以32位或64位运行,具体取决于底层操作系统。这在Express版本中很难实现,因为无法从IDE中指定目标平台。
  2. 显式打开注册表的64位视图。在.net中,这需要RegistryView枚举。但请注意,此功能需要.net 4,对于早期版本的.net,需要p / invoke才能打开注册表视图。
  3. 继续定位x86并写入HKLM\Software。在处理启动注册表项时运行时,64位系统将读取注册表的两个视图。换句话说,您现有的方法已经有效!
  4. 作为最后一点,我要评论设置此注册表项的任务最好留给安装程序。修改HKLM\Software下的密钥需要管理员权限,通常您只能在安装时拥有管理员权限。

答案 1 :(得分:3)

尝试使用RegistryView中的64 bitRegistry64视图中明确打开注册表。同样,您可以使用32 bit选项

打开Registry32视图

根据MSDN

  

您可以在使用OpenBaseKey时指定注册表视图   OpenRemoteBaseKey(RegistryHive,String,RegistryView)方法,以及   RegistryKey对象上的FromHandle属性。

答案 2 :(得分:0)

确保您的C#app平台是x64。由于HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node操作系统中HKEY_LOCAL_MACHINE\SOFTWARE个应用的x86x64

答案 3 :(得分:0)

不应该责怪C#,而是64位Windows。

在Win64中,32位应用程序的注册表值(即编译为x86)存储在Wow6432Node注册表节点下,而64位应用程序的注册表值直接存储在给定路径下。

请参阅Registry RedirectorMSDNsupport KB