c# - 从同一应用程序读取和写入 x86 和 x64 注册表项

标签 c# .net registry x86-64

我正在运行编译为 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.RegistryDefaultRegistryView.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/

相关文章:

c# - 在 .Net 4.5 中使用 async/await 编写多线程方法

c++ - 如何将参数传递给由注册表启动的 C++ 程序?

c++ - 如何在 C++ 中创建不可删除的注册表项(或文件)

c# - 在 C# 代码中创建元素时出现 WPF 绑定(bind)错误

c# - Azure 云表存储

c# - 无法通过反射更改只读字段

c# - System.IO.Compression DLL 丢失且可能存在版本冲突

c# 如何创建动态列表/数组

php - Magento - Mage 注册表项 "_resource_helper/core"已存在

c# - 将一系列瓷砖拼接在一起