Registry OpenSubkey returns null,尽管它在那里

Registry OpenSubkey returns null, although it is there

我已经阅读了该主题的几乎所有其他问题,但它们通常是通过在注册表中使用错误的体系结构视图来解决的。

我正在尝试打开“...\Outlook\Addins”中的一个子项。我有可用于两种架构的子项("HKLM\Software... " 和 "HKLM\Software\Wow3264Node..." ).但我通过测试知道,代码在 "WOW6432Node".

下查找

这是代码片段。

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Default);
var reg = hklm.OpenSubKey(@"Software\Microsoft\Office\Outlook\Addins\MyAddin", false);

我也试过了

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry32);
var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry64);

调试它并查找可见的子项,这些子项为我提供了所有其他条目(甚至是新创建的条目),但不是我正在寻找的那个。

我还检查了注册表权限,这与我看到的其他权限相同。

那么为什么我总是收到 "reg" 的空值?

编辑:也许我应该补充一点,我正在从插件内部寻找该密钥。从简短的测试控制台应用程序尝试时,我在调用

时看到了子项
reg.GetSubKeyNames();

尝试改变这个

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Default);

至此

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry64);

当您在 64 位 OS 上 运行 一个 32 位应用程序时,它会尝试自动找到 Wow6432Node。 另一种解决方法可能是为 x64 架构编译它。

有关 RegistryView 枚举的更多信息,请访问 MSDN。 注意这一行;

If you request a 64-bit view on a 32-bit operating system, the returned keys will be in the 32-bit view.

所以您始终请求 64 位密钥应该是安全的。

看起来,这是一个证券"feature"。无法访问正在寻找它的插件的注册表分支。 我想存储在那里的信息需要存储在其他地方。

这让我苦恼了大约 4 个小时,直到我意识到我忘记取消选中“项目”>“软件属性”下的 "Prefer 32-bit"...