我正在运行编译为 x86 的应用程序,它在 64 位 Windows 上运行。
为了解决 ClickOnce 文件关联问题,我想从注册表的 x86 View 中读取一些 CLSID 值,然后将它们写入 x64 View 。
明确地说,这意味着我想从 x86 应用程序同时读取 x86 注册 TableView ,然后写入 x64 注册 TableView 。我想获取在 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
而不是它返回 key - 但我希望它在使用 Registry64
时返回 null > 因为 x64 View 中不存在该键,因此不应进行重定向。
使用 RegistryView
是合适的做法,还是我应该直接使用 WinAPI?
最佳答案
我可能误解了您的要求,但如果您在 32 位进程中运行,那么您的所有 key 都将位于 Wow6432Node\xxxxx
节点中。因此,如果您尝试将它们从 HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}
(并且没有手动指定 64 位 View )复制到 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);
关于c# - 从同一应用程序读取和写入 x86 和 x64 注册表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15424205/