IIS 6.0 64位:SysInterals进程浏览器显示32位dll加载

本文关键字:显示 浏览器 32位 dll 加载 进程 SysInterals 64位 IIS | 更新日期: 2023-09-27 18:12:00

试图确定一个问题,这很可能是由于我们的web应用程序试图加载一个32位版本的OracleAccess.dll,而IIS运行为64位(看起来32位和64位版本的Oracle驱动程序可能并排安装)。

服务器上有两个站点,一个用于生产,一个用于测试。生产版本的代码是由一个已经离开我们的员工部署的。这个网站很好用。我们刚刚部署的另一个站点;它是为Any CPU编译的,我们在加载Oracle驱动程序时出现错误。

如果我在SysInternal的进程资源管理器中查看生产站点的IIS工作进程,突出显示IIS工作进程,并在下窗格视图中查看加载的dll,我会看到一些奇怪的数据。

工作进程的信息:

Process   Version        User Name                     PID   Image Type
w3wp.exe  6.0.3790.3959  NT AUTHORITY'NETWORK SERVICE  3320  64-bit 

但是在加载的dll列表中,有些被列为64位映像,有些被列为32位映像?这是不可能的(AFAIK)加载32位dll到64位进程空间,所以也许我不理解我所看到的报告。

DLL句柄的子集info:

Name                Image Type   Description                          Company Name            Version         
aspnet_filter.dll   64-bit       Microsoft ASP.NET ISAPI Filter DLL   Microsoft Corporation   4.0.30319.1     
admwprox.dll        64-bit       IIS Admin Com API Proxy dll          Microsoft Corporation   6.0.3790.3959
adsldp.dll          64-bit       ADs LDAP Provider DLL                Microsoft Corporation   5.2.3790.3959
adsldpc.dll         64-bit       ADs LDAP Provider C DLL              Microsoft Corporation   5.2.3790.3959
advapi32.dll        64-bit       Advanced Windows 32 Base API         Microsoft Corporation   5.2.3790.4555
aspnet_filter.dll   64-bit       Microsoft ASP.NET ISAPI Filter DLL   Microsoft Corporation   4.0.30319.1
aspnet_isapi.dll    64-bit       Microsoft ASP.NET ISAPI Shim DLL     Microsoft Corporation   2.0.50727.3053
comctl32.dll        64-bit       Common Controls Library              Microsoft Corporation   5.82.3790.4770
comctl32.dll        64-bit       User Experience Controls Library     Microsoft Corporation   6.0.3790.4770
comres.dll          64-bit       COM+ Resources                       Microsoft Corporation   2001.12.4720.3959
    (Next few are our DLLs)
CSA.Database.DLL             32-bit       CSA.Database                         TE                      1.7.8221.0
CSA.Database.DLL             32-bit       CSA.Database                         TE                      1.7.8221.0
CSA.Loggers.DLL              32-bit       CSA.Loggers                          TE                      1.7.8221.0
CSA.Loggers.DLL              32-bit       CSA.Loggers                          TE                      1.7.8221.0
CSA.Network.DLL              32-bit       CSA.Network                          TE                      1.7.8221.0
CSA.Network.DLL              32-bit       CSA.Network                          TE                      1.7.8221.0
Enterprise.Data.DLL          32-bit       Enterprise.Data                      TE                      2.35.3.0
Enterprise.Data.DLL          32-bit       Enterprise.Data                      TE                      2.35.3.0
Enterprise.Diagnostics.DLL   32-bit       Enterprise.Diagnostics          TE                      2.35.3.0
Enterprise.Diagnostics.DLL   32-bit       Enterprise.Diagnostics          TE                      2.35.3.0
    (More Microsoft DLLs... some 32-bit, some 64-bit??)
FederatedLibrary.DLL   32-bit   FederatedLibrary   Microsoft   1.0.0.0
FederatedLibrary.DLL   32-bit   FederatedLibrary   Microsoft   1.0.0.0
gdi32.dll              64-bit   GDI Client DLL     Microsoft Corporation   5.2.3790.4396
gzip.dll               64-bit   GZIP Compressn DLL Microsoft Corporation   6.0.3790.1830
Microsoft.Practices.EnterpriseLibrary.Common.DLL   32-bit   Enterprise Library Shared Library   Microsoft Corporation   4.1.0.0
Microsoft.Practices.EnterpriseLibrary.Common.DLL   32-bit   Enterprise Library Shared Library   Microsoft Corporation   4.1.0.0
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.DLL   32-bit   Enterprise Library Exception Handling Application Block   Microsoft Corporation   4.1.0.0
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.DLL   32-bit   Enterprise Library Exception Handling Application Block   Microsoft Corporation   4.1.0.0
Microsoft.Practices.EnterpriseLibrary.Logging.DLL  32-bit   Enterprise Library Logging Application Block   Microsoft Corporation   4.1.0.0
Microsoft.Practices.EnterpriseLibrary.Logging.DLL  32-bit   Enterprise Library Logging Application Block   Microsoft Corporation   4.1.0.0
    (And finally, the Oracle drivers that seem to be causing issue... 64-bit)
oracle.dataaccess.dll   64-bit   Oracle.DataAccess.dll   Oracle Corporation   2.112.1.0
oracle.dataaccess.dll   64-bit   Oracle.DataAccess.dll   Oracle Corporation   2.112.1.0

我已经使用corflags来查看是否工作,生产dll被显式编译为32位…如果我理解输出,它们不是。

C:'SingleSignOn'bin>corflags CSA.Network.dll
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 1
ILONLY    : 1
32BIT     : 0
Signed    : 0


理解新编译的部署为什么不能工作的第一步是理解当前的部署为什么可以工作。有人能解释一下我看到了什么吗?

我需要知道的:

  1. IIS是否作为64位进程运行,它会以64位加载Any CPU dll吗?
  2. 如果是,为什么这些dll被进程资源管理器列为32位镜像?
  3. IIS是否可能将32位dll加载到64位进程空间?
  4. 如果IIS是64位进程,并且我们加载一个编译为Any CPU的网站,如果它所依赖的任何dll都是32位dll(例如它是针对32位版本的Oracle驱动程序编译的),它会强制32位吗?

IIS 6.0 64位:SysInterals进程浏览器显示32位dll加载

进程资源管理器只是将AnyCPU dll报告为32位。PE头中包含此信息的插槽没有AnyCPU的设置,因此编译器将它们标记为32位。但是请放心,64位进程只会加载64位dll,或者它强制进入64位模式的AnyCPU dll。

本地dll, comtl32, gdi32被标记为64位,这证明你的进程和其中的所有代码都以64位运行。这只是AnyCPU dll的误导。

在您的应用程序池中设置Enable 32位应用程序为true以强制您的应用程序为32位。

应用程序的dll可以标记为Any CPU,如果应用程序池设置为32位模式,则将加载到32位进程中。

对于IIS 6.0,您可能需要遵循这里的说明http://extended64.com/blogs/rhoffman/archive/2005/05/10/482.aspx

cscript % SystemDrive % ' inetpub ' AdminScripts ' adsutil。vbs set w3svc/AppPools/Enable32bitAppOnWin64 1

根据安装的Oracle驱动程序,您可以强制加载正确的驱动程序。例如

 <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral" processorArchitecture="amd64"/>
                <bindingRedirect oldVersion="0.0.0.0-10.2.0.100" newVersion="2.112.1.0"/>
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-10.2.0.100" newVersion="10.2.0.100"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>