2011-10-19 10 views
3

IISが64ビットとして実行されているときに、32ビットバージョンのOracleAccess.dllをロードしようとしているWebアプリケーションの可能性が高い問題を特定しようとしています(32ビット版と64ビット版の両方に見えます)。オラクルのドライバが並行してインストールされる可能性があります)。IIS 6.0 64ビット:32ビットDLLがロードされているSysInterals Proc Explorer?

サーバーには、本番用とテスト用の2つのサイトがあります。プロダクションには、もはや私たちと一緒にいない従業員によって導入されたコードがあります。そのサイトは機能します。もう展開したばかりのサイト。 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ビットのプロセス空間にロードすることはできません(AFAIK)ので、私が見ているレポートを理解していない可能性があります。私は作業が、生産DLLが、私は出力を理解していれば、彼らはしている... 32ビットのために明示的にコンパイルされたかどうかを確認するためにcorflagsを使用しました

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 

:DLLのハンドル情報の

サブセットない。

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がない理由を理解することです。誰も私が見ていることを私に説明することはできますか?

  1. は、IISが64ビットプロセスとして実行されている、そしてそれは、64ビットとしてAny CPU DLLをロードします:

    私が知っている必要がありますか?

  2. はいの場合、これらのDLLはプロセスエクスプローラで32ビットイメージとして表示されるのはなぜですか?
  3. IISが32ビットDLLを64ビットプロセス空間にロードすることは可能ですか?
  4. IISが64ビットプロセスで、Any CPUとしてコンパイルされたWebサイトを読み込むと、依存するDLLのいずれかが32ビットDLLである場合、強制的に32ビットが強制されます(たとえば、32ビットOracleドライバのバージョン?)事前に

おかげで...

答えて

4

プロセスエクスプローラはちょうど32ビットとしてAnyCPU DLLを報告しています。この情報を含むPEヘッダーのスロットにはAnyCPUの設定がないため、コンパイラーはそれらを32ビットとしてマークします。しかし、64ビットプロセスは、64ビットDLL、または64ビットモードに強制するAnyCPU DLLのみをロードすることができます。

ネイティブDLLのcomctl32、gdi32は64ビットとマークされています。これは、プロセスとその中のすべてのコードが64ビットとして実行されていることを証明しています。誤解を招くAnyCPU DLLだけです。

+0

ありがとう、David、それについて説明します...私は32ビットとしてリストされたすべてのMicrosoft DLLが.NET DLLであることがわかります(FederatedLibrary.dllについてはわかりませんでしたがもちろんそうだ)。今私はちょうどそれが64ビットではないロードしようとしているものを理解する必要があります:) –

0

アプリケーションプールで32ビットアプリケーションを有効にしてアプリケーションを32ビットに強制します。

アプリケーションのdllはすべてのCPUとしてマークすることができ、アプリケーションプールが32ビットモードに設定されている場合は32ビットプロセスにロードされます。

IIS 6.0の場合、あなたはここに指示に従う必要があるかもしれませんhttp://extended64.com/blogs/rhoffman/archive/2005/05/10/482.aspx

ます。cscript%SystemDrive%に\ Inetpub \ AdminScripts \ adsutil.vbsを参​​照し、あなたをインストールしたOracleドライバによってはW3SVC /アプリケーションプール/ Enable32bitAppOnWin64 1

設定正しいものに強制的にロードさせることができるかもしれない。つまり、

<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> 
+0

私は実際に、このサーバー上ではなく、他の場所でそれをやったことがあります。残念ながら、IIS 6.0の場合、これはIISレベルの設定であり、IIS 7のようなアプリケーションプールの設定ではなく、そのサーバーで実行されている他のサイトには影響しません。しかし、良い提案は、 –

+0

あなたが持っているもう一つのオプションは、64bitのOracleドライバをweb.configのassemblyBinding経由で読み込ませることです。 –

+0

奇妙なことは、本番インスタンスでは、64ビットのOracleドライバがロードされているからです。なぜテストにならないのか分かりません。実際に何が起こっているかを見るためにいくつかの融合テストを行う予定です。ありがとう! –

関連する問題