尝试执行写入注册表的简单任务,以便在启动时运行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);
答案 0 :(得分:6)
您的进程以x86为目标(即它是一个32位进程),当在WOW64仿真器下的64位计算机上运行时,registry redirection开始运行。对于注册表的某些部分,系统维护两个不同的视图,一个用于32位进程,另一个用于64位进程。受重定向影响的密钥列表位于:Registry Keys Affected by WOW64。
重定向对应用程序是透明的。 32位进程访问HKLM\Software
并且不知道(实际上不需要知道)64位操作系统实际访问HKLM\Software\Wow6432Node
。
您可以使用多种选项:
RegistryView
枚举。但请注意,此功能需要.net 4,对于早期版本的.net,需要p / invoke才能打开注册表视图。HKLM\Software
。在处理启动注册表项时运行时,64位系统将读取注册表的两个视图。换句话说,您现有的方法已经有效!作为最后一点,我要评论设置此注册表项的任务最好留给安装程序。修改HKLM\Software
下的密钥需要管理员权限,通常您只能在安装时拥有管理员权限。
答案 1 :(得分:3)
尝试使用RegistryView中的64 bit
在Registry64
视图中明确打开注册表。同样,您可以使用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
个应用的x86
为x64
,
答案 3 :(得分:0)
不应该责怪C#,而是64位Windows。
在Win64中,32位应用程序的注册表值(即编译为x86)存储在Wow6432Node注册表节点下,而64位应用程序的注册表值直接存储在给定路径下。