我已经阅读了这个主题的几乎所有其他问题,但它们通常通过在注册表中使用错误的架构视图来解决。
我正在尝试在“... \ 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”总是收到null?
编辑:也许我应该补充一下,我正在从插件中寻找那把钥匙。从一个简短的测试控制台应用程序尝试它时,我在调用
时看到该子项reg.GetSubKeyNames();
答案 0 :(得分:1)
这大约花了4个小时,直到我意识到我忘了取消选中“项目”>“软件属性”下的“首选32位”。
答案 1 :(得分:0)
尝试更改此
var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Default);
到这个
var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry64);
在64位操作系统上运行32位应用程序时,它会尝试自动查找Wow6432Node
。
另一种方法可能就是为x64架构编译它。
可以在MSDN上找到有关RegistryView枚举的更多信息。 注意这一行;
如果在32位操作系统上请求64位视图,则返回的键将位于32位视图中。
因此,您应始终安全地请求64位密钥。
答案 2 :(得分:0)
看起来,这是一个安全"功能"。无法访问正在寻找它的插件的注册表分支。 我希望存储在那里的信息需要存储在其他地方。