C#WOW6432registry节点messin事情了

试图完成写入registry的简单任务,使C#应用程序在启动时运行。

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

试过看了一下,但似乎没有一个简单的答案这个问题:如何具体写一个密钥/SOFTWARE/Microsoft/Windowsregistry项,而不是它写入WOW6432 ? 我已经检查,以确保我的Visual C#速成解决scheme文件的平台列为x86 …所以它正在编译…我只是不想要那个wow6432目录。

感谢您的任何build议!

编辑:

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

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

Solutions Collecting From Web of "C#WOW6432registry节点messin事情了"

您的进程针对x86(即它是一个32位进程),并在WOW64模拟器下的64位计算机上运行时, 注册表重定向发挥作用。 对于注册表的某些部分,系统维护两个不同的视图,一个用于32位进程,另一个用于64位进程。 受重定向影响的密钥列表在这里: 受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位系统将读取注册表的两个视图。 换句话说,你现有的方法已经可行了!

作为最后一点,我会评论说,设置这个注册表项的任务最好留给安装程序。 修改HKLM\Software下的密钥需要管理员权限,通常您只能期望在安装时拥有管理员权限。

尝试在RegistryView中使用Registry64显式打开注册表在64 bit视图。 同样,您可以使用Registry32选项打开32 bit视图

根据MSDN

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

确保你的C#应用​​程序平台是x64。 因为HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nodex64操作系统中x86应用程序的HKEY_LOCAL_MACHINE\SOFTWARE

不是C#是怪罪,而是一般的64位Windows。

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

请参阅注册表重定向器 , MSDN和支持KB 。