【问题标题】:Why is OpenSubKey() returning null on my Windows 7 64-bit system?为什么 OpenSubKey() 在我的 Windows 7 64 位系统上返回 null?
【发布时间】:2010-03-17 17:18:39
【问题描述】:

当 32 位注册表项位于注册表中的 Wow6432node 下时,OpenSubKey() 和其他 Microsoft.Win32 注册表函数是否在 64 位系统上返回 null?

我正在开发一个从 .NET 库调用 OpenSubKey() 的单元测试框架。

我的开发系统是 Windows 7 64 位环境,安装了Visual Studio 2008 SP1 和 Windows 7 SDK。

我们正在单元测试的应用程序是一个 32 位应用程序,因此注册表是在HKLM\Software\Wow6432node 下虚拟化的。当我们调用时:

Registry.LocalMachine.OpenSubKey( @"Software\MyCompany\MyApp\" );

返回 Null,但明确说明看这里有效:

Registry.LocalMachine.OpenSubKey( @"Software\Wow6432node\MyCompany\MyApp\" );

据我了解,此函数应该与 32 位或 64 位环境无关,并且应该知道跳转到虚拟节点。

更奇怪的是,在我们的应用程序的编译和安装版本中完全相同的调用在同一系统上运行得很好,并且正在获取运行所需的注册表项;它们也被放置在HKLM\Software\Wow6432node

我该怎么办?

【问题讨论】:

标签: .net 64-bit registry


【解决方案1】:

听起来您的 单元测试项目 编译为 64 位。在单元测试项目的Compile 设置中,将“目标CPU”设置为x86(而不是AnyCPU)。

【讨论】:

  • 啊哈!这确实是正在发生的事情。非常感谢!
【解决方案2】:

如果你真的需要 32 位应用程序,可以这样访问 64 位注册表:

RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = localMachine64.OpenSubKey(@"Software\MyCompany\MyApp\", false);

【讨论】:

  • OpenBaseKey() 所需的最低 .NET 版本是多少?特别是,它可以使用 Visual Studio 2008 吗?
  • 好像是.NET 4.0。来自another answer:“对于版本 4 之前的 .NET 版本,没有允许访问备用注册表视图的框架 API。”。
【解决方案3】:

是的,Windows 7 64 位和 Visual Studio 2008 SP1 也有同样的问题。但是我的解决方案是相反的,就是从“x86”改成“Any CPU”或者“x64”。

【讨论】:

  • 这确实也可以,但就我而言,我们的自动化环境需要 32 位支持
【解决方案4】:

谁可能关心

在我的测试中,如果你使用 AnyCpu 构建代码来执行 OpenSubKey,并在 x64 操作系统上运行它,你会发现你没有在你期望的地方工作。

例如:(在 .net 4.5.2 中测试

RegistryKey rsk = Registry.LocalMachine.OpenSubKey("SOFTWARE"); 

当您检查 rsk.GetSubKeyNames()

我在调试中检查了这个 ,结果既不是HKLM也不是HKCU,至少我不知道它是什么(很像HKCU但不一样)。

这可能导致的最著名的问题是:

DeleteSubKeyTree 将抛出参数异常。 如果你在删除之前尝试打开子键是可以的,但是在删除的时候它会说,嘿,它不在这里......

所以要小心,现在我再也不会使用 AnyCPU了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多