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

标签 c# .net iis registry

我有一个应用程序(用 C# 编写),它在 Windows Server 2008(64 位)上运行。在此应用程序中,我必须检查有关 IIS 的一些注册表项。其中,我想访问 key HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp\Components\WMICompatibility" 检查是否启用了 IIS 6 兼容模式。为此,我使用 Microsoft.Win32Registry.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/

相关文章:

c# - SynchronizationContext.Current 在主 UI 线程的 Continuation 中为 null

c# - 我可以使用 LINQ GroupBy 更干净地执行此操作吗?

.net - 服务不可用 - 应用程序池无法启动

php - 如何检查你的代码环境是在 Windows 上还是在 Linux 或其他操作系统上

c# - 使用 [ClassInitilize]Attribute 优于静态构造函数(或 : TestContext wat?!)

c# - 附加文本不起作用

c# - HttpWebRequest 截断带有非英文符号的 URL

.NET 框架依赖项

asp.net - ASP.NET 网站首页加载缓慢

c# - 从 ASP.NET C# 启动程序