64-разрядная версия IIS 6.0: SysInterals Proc Explorer, показывающий загруженные 32-разрядные библиотеки DLL? - PullRequest
3 голосов
/ 19 октября 2011

Попытка определить проблему, которая наиболее вероятна из-за того, что наше веб-приложение пытается загрузить 32-разрядную версию OracleAccess.dll, когда IIS работает как 64-разрядная (она выглядит как 32-разрядная и 64-разрядная).версии драйверов Oracle могут быть установлены параллельно).

У меня есть два сайта на сервере, один для производства и один для тестирования.У производственного кода есть код, который был развернут сотрудником, которого больше нет с нами.Этот сайт работает.Другой сайт, который мы только что развернули;он был скомпилирован для Any CPU, и мы получаем ошибки при загрузке драйверов Oracle.

Если я просматриваю рабочий процесс IIS для рабочего сайта в проводнике процессов SysInternal, выделяю рабочий процесс 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:

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. Если да, почему эти DLL-библиотеки перечислены в Process Explorer как 32-битные образы?
  3. Возможно ли, что IIS загружает 32-битные DLL в 64-битныебитное пространство процесса?
  4. Если IIS является 64-битным процессом, и мы загружаем веб-сайт, скомпилированный как Any CPU, будет ли он работать 32-битным, если какая-либо из библиотек DLL, от которых он зависит, является 32-битной DLL (например, он был скомпилирован с 32-битной версией драйверов Oracle?)

Заранее спасибо ...

Ответы [ 2 ]

4 голосов
/ 19 октября 2011

Process Explorer просто сообщает, что библиотеки AnyCPU 32-битные. В слоте PE-заголовка, который содержит эту информацию, нет настройки для AnyCPU, поэтому компилятор помечает их как 32-битные. Но будьте уверены, что 64-битный процесс будет загружать только 64-битные DLL или библиотеки AnyCPU, которые он переводит в 64-битный режим.

Собственные библиотеки DLL, comctl32, gdi32 помечены как 64-битные, и это является доказательством того, что ваш процесс и весь код внутри него работают как 64-битные. Это просто библиотеки AnyCPU, которые вводят в заблуждение.

0 голосов
/ 20 октября 2011

В пуле приложений установите для параметра Включить 32-разрядные приложения значение true, чтобы приложение стало 32-разрядным.

dll вашего приложения может быть помечен как Любой ЦП и будет загружен в 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>
...