IIS 6.0 64 位:SysInterals Proc Explorer 显示已加载 32 位 DLL?

问题描述 投票:0回答:2

尝试确定一个问题,该问题很可能是由于我们的 Web 应用程序在 IIS 以 64 位运行时尝试加载 32 位版本的 OracleAccess.dll(看起来既是 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位图像? (据我所知)不可能将 32 位 DLL 加载到 64 位进程空间中,所以也许我不理解我看到的报告。

DLL 句柄信息的子集:

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 位进程运行?它会加载
    Any CPU
    DLL 作为 64 位吗?
  2. 如果是,为什么 Process Explorer 将这些 DLL 作为 32 位映像列出?
  3. IIS 是否可以将 32 位 DLL 加载到 64 位进程空间中?
  4. 如果 IIS 是 64 位进程,并且我们加载编译为
    Any CPU
    的网站,如果它依赖的任何 DLL 是 32 位 DLL(例如,它是针对 32 位编译的),它会强制使用 32 位吗? Oracle 驱动程序的版本?)

提前致谢...

c# iis iis-6 32bit-64bit
2个回答
4
投票

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

本机 DLL、comctl32、gdi32 被标记为 64 位,这证明您的进程和其中的所有代码都以 64 位运行。只是 AnyCPU DLL 具有误导性。


0
投票

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

如果应用程序池设置为32位模式,您的应用程序的dll可以被标记为任何CPU,并且将被加载到32位进程中。

对于 IIS 6.0,您可能需要按照此处的说明进行操作 http://extended64.com/blogs/rhoffman/archive/2005/05/10/482.aspx

cscript %SystemDrive%\inetpub\AdminScripts dsutil.vbs 设置 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>
© www.soinside.com 2019 - 2024. All rights reserved.