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
理解新编译的部署为什么不能工作的第一步是理解当前的部署为什么可以工作。有人能解释一下我看到了什么吗?
我需要知道的:
- IIS是否作为64位进程运行,它会以64位加载
Any CPU
dll吗? - 如果是,为什么这些dll被进程资源管理器列为32位镜像?
- IIS是否可能将32位dll加载到64位进程空间?
- 如果IIS是64位进程,并且我们加载一个编译为
Any CPU
的网站,如果它所依赖的任何dll都是32位dll(例如它是针对32位版本的Oracle驱动程序编译的),它会强制32位吗?
进程资源管理器只是将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>