我有一个应用程序(用 C# 编写),它在 Windows Server 2008(64 位)上运行。在此应用程序中,我必须检查有关 IIS 的一些注册表项。其中,我想访问 key HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp\Components\WMICompatibility" 检查是否启用了 IIS 6 兼容模式。为此,我使用 Microsoft.Win32 的 Registry.GetValue。
由于某些原因,解决方案必须使用 x86 进行编译。结果是,不再可能访问 HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp\Components 但仍然可以从 HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp 读取 key >。当使用“AnyCPU”-flag 编译它时,注册表访问工作正常。
那么这种行为的原因是什么?是否有针对此问题的解决方案或解决方法?
最佳答案
你犯规了 registry redirection .
最好的解决方案是打开注册表的 64 位 View ,如下所示:
using Microsoft.Win32;
...
RegistryKey registryKey =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).
OpenSubKey(@"Software\Microsoft\InetStp\Components");
object value = registryKey.GetValue(@"WMICompatibility");
如果您希望您的代码在 32 位和 64 位机器上都能工作,那么您需要编写一些注册 TableView 之间的切换代码。
注意:从 32 位进程访问 64 位 View 的功能仅添加到 .net 4 中的 .net 库中。似乎在此之前您需要使用 native API,例如使用 P/Invoke。
关于c# - 在 64 位计算机上使用 C# 和 "BUILD x86"进行注册表访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582020/