我正在运行我的应用程序,编译为x86,并且它在64位Windows上运行。从同一应用程序读取和写入x86和x64注册表项
为了解决ClickOnce文件关联问题,我想从注册表的x86视图中读取一些CLSID值,然后将它们写入到x64视图。
要清楚,这意味着从x86应用程序我想要同时从x86注册表视图中读取,然后写入到x64注册表视图。我想获取我在HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}
下找到的值,并将它们写入HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}
。
我该怎么做?使用RegistryView
会产生意想不到的结果。例如,这OpenSubKey
调用返回NULL:
keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);
如果我使用RegistryView.RegistryDefault
或RegistryView.Registry64
而返回的关键 - 但我希望它使用Registry64
何时返回null,因为该密钥不会在64看法存在并且不应该发生重定向。
正在使用RegistryView
要做的事情,还是应该直接使用WinAPI?
谢谢@Zipper,你的答案是正确的 - 我在我的脑子里的东西后到前(这不是很明显,Registry32从Wow6432Node节点捡东西)。 – slugster 2013-03-15 07:03:19
@ Zipper我有一些疑惑。 32位应用程序可以访问注册表的64位配置单元。我不确定这一点。 – 2013-03-15 07:34:03
只是一个侧面说明:如果您在.NET4之前使用.NET,这种方法将不适用于您.. – Luke 2015-03-19 15:21:06