slu*_*ter 14 .net c# registry x86-64
我正在运行编译为x86的应用程序,它运行在64位Windows上.
为了解决ClickOnce文件关联的问题,我想从注册表的x86视图中读取一些CLSID值,然后将它们写入x64视图.
要清楚,这意味着从x86应用程序我想同时从x86注册表视图读取,然后写入x64注册表视图.我想取下我找到的值HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}并将其写入HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}.
我该怎么做?使用a RegistryView会产生意想不到的结果.例如,此OpenSubKey调用返回null:
keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);
Run Code Online (Sandbox Code Playgroud)
如果我使用RegistryView.RegistryDefault或RegistryView.Registry64代替它返回密钥 - 但我希望它在使用时返回null,Registry64因为在x64视图中不存在该密钥,并且不应该发生重定向.
使用RegistryView适当的东西,或者我应该直接使用WinAPI?
Zip*_*per 19
我可能会误解你的问题,但如果你在32位进程中运行,那么你的所有密钥都会在Wow6432Node\xxxxx节点中.因此,如果您尝试从中复制它们HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}(并且未手动指定64位视图),则HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}您将复制相同的值.这段代码应该有效:
keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
// Note this calls HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}:
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);
var regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
// Note this calls HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}:
var regularClassKey = regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11288 次 |
| 最近记录: |