在64位计算机上使用C#和"BUILD x86"进行注册表访问

Elm*_*mex 7 .net c# iis registry

我有一个应用程序(用C#编写),它运行在Windows Server 2008(64位)上.在此应用程序中,我必须检查有关IIS的一些注册表项.其中我想访问密钥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读取密钥.使用" AnyCPU "-flag 编译时,注册表访问工作正常.

那么这种行为的原因是什么?这个问题有解决方案或解决方法吗?

Dav*_*nan 12

您正在违反注册表重定向.

最好的解决方案是打开注册表的64位视图,如下所示:

using Microsoft.Win32;
...
RegistryKey registryKey = 
    RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).
    OpenSubKey(@"Software\Microsoft\InetStp\Components");
object value = registryKey.GetValue(@"WMICompatibility");
Run Code Online (Sandbox Code Playgroud)

如果您希望代码在32位和64位计算机上运行,​​那么您需要在注册表视图之间进行代码切换.

注意:从32位进程访问64位视图的功能仅添加到.net 4中的.net库中.在此之前,您似乎需要使用本机API,例如使用P/Invoke.