我想知道是否可以在64位PC上访问C#中的以下注册表项。
HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \运行
在32位PC上访问时,它可以正常工作,但在64上它会将其重定向到具有不同密钥的HKLM \ SOFTWARE \ Wow6432Node的本机64位路径。我已经查看了相关的各种文章,但无法真正找到关于如何在C#中使用64位PC访问32位密钥的明确答案。感谢。
答案 0 :(得分:13)
如果您的目标是.Net Framework 4.0或更高版本,那么您可以通过在打开所需的注册表项时传递RegistryView.Registry32值来执行此操作。
如果您要定位以前版本的.Net Framework,那么您需要使用P / Invoke直接调用RegOpenKeyEx,允许您传递KEY_WOW64_32KEY标记。
这里有一个指南更详细:
答案 1 :(得分:5)
在x64中编译应用程序,一切都很好。在Visual Studio 2010中,您可以通过更改Project Properties > Build
对于VS Express用户:
在VC#Express中,缺少此属性,但您仍然可以创建 x86配置,如果你知道在哪里看。
它看起来像一长串的步骤,但一旦你知道这些步骤 事情变得容易多了。任何只有VC#Express的人都会 可能觉得这很有用。了解Configuration Manager后, 它下次会更加直观。
- 在VC#Express中,转到工具 - >选项。
- 在“选项”对话框的左下角,选中该框 说,“显示所有设置”。
- 在左侧的树状视图中,选择“项目和 解决方案。”
- 在右侧的选项中,选中“显示”框 高级构建配置。“
- 单击“确定”。
- 转到Build - >配置管理器......
- 在项目旁边的“平台”列中,单击组合框和 选择“”。
- 在“新平台”设置中,选择“x64”。
- 单击“确定”。
- 点击关闭。
- 那里,你现在有一个x64配置!非常简单! : - )
醇>
答案 2 :(得分:5)
Project + Properties,Build选项卡,Platform target =任何CPU。从32位应用程序访问64位注册表需要.NET 4和带有RegistryView.Registry64选项的新RegistryKey.OpenBaseKey()方法。
这只允许您读取密钥,写入密钥值需要UAC提升。您可以在没有提升的情况下写入HKCU,也不需要进行注册表重定向。
答案 3 :(得分:2)
你有倒退,Wow6432Node适用于32位应用程序。因此,如果您的应用程序是32位(x86),那么您将自动重定向到该“节点”。
您可以使用.NET 4中的FromHandle方法指定要使用的视图,但它的使用不是很明显,并且可以problems。
此answer使用Win32 API解决了这个问题,您也可以在C#中使用它。
答案 4 :(得分:1)
它想重定向。您需要检测此重定向并改为读取WoW6432Node键。 HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run是64位注册表,只能由64位应用程序访问。
显然,你应该编写代码来支持两者。