首页 文章

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

提问于
浏览
7

我有一个应用程序(用C#编写),它运行在Windows Server 2008(64位)上 . 在此应用程序中,我必须检查有关IIS的一些注册表项 . 其中我想访问密钥 HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp\Components\WMICompatibility" 以检查是否启用了IIS 6兼容模式 . 为此,我使用 Registry.GetValueMicrosoft.Win32 .

由于某些原因,必须使用 x86 编译解决方案 . 结果是,不再可能访问 HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp\Components 但仍然可以从 HKEY_LOCAL_MACHINE\Software\Microsoft\InetStp 读取密钥 . 用“ AnyCPU ”-flag编译它时,注册表访问工作正常 .

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

2 回答

  • 3

    Windows x64有一个单独的x86程序节点(不是最明智的想法)

    所有注册表项都在 HKEY_LOCAL_MACHINE\Software\WOW6432Node

    更多关于这个问题:
    How to view the system registry by using 64-bit versions of Windows

    该程序仍“认为”它正在写入同一条道路 .

    我建议你修复你的设置(调度)程序,在正确的位置写下初始设置 .

    Edit ,来自MSDN的一些"information":

    Registry Keys Affected by WOW64

  • 12

    你对registry redirection犯规了 .

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

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

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

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

相关问题