0

IIS は従来の ISAPI 拡張機能と IIS モジュールをロードします。どちらも同じ名前の DLL を使用しますが、これらの DLL は異なります (異なるバージョンのサードパーティにリンクされています)。これまでのところ問題はないはずです。各コンポーネント (拡張機能とモジュール) は独自のフォルダーにあり、それぞれに独自のバージョンの DLL がありますが、IIS がワーカー プロセスを開始し、拡張機能とモジュールが何らかの形で読み込まれると、拡張機能はモジュールのフォルダーから DLL。モジュールのコードを調べたところ、プロセス全体に影響する SetDllDirectory の使用が見つかりました。出来上がり、これが問題です、と私は言いました。この呼び出しを取り除いた後(私のニーズに合ったDLL検索フラグを使用してLoadLibraryExに置き換えました)、問題は解決しませんでした。最後に、これらの DLL の両方に一意の名前を付けることで、明らかに問題が解決する (または解決しない) ことに気付きました。ただし、それはクリーンでエレガントなソリューションではありません。IIS がこのような奇妙な動作を示す理由を知っている人はいますか?

Win2008、IIS7.5、ISAPI 拡張機能 - ネイティブ、C++、VC2010、IIS モジュール - ネイティブ、C++、VS2010、上記の問題のある DLL - C++/CLI、.NET3.5 サード パーティ アセンブリとリンク。すべてがx64です

4

1 に答える 1

0

「SxS をサポートするように設計されていない限り、同じ名前の 2 つの「クラシック」DLL を同じプロセスに配置することはできません」処理する

EDIT001: 5 年後 :) これの根本的な原因は、IIS がデータをロードする方法にあります。ワーカー プロセスが開始されると、どのような場合でも IIS モジュールが読み込まれ、次に ISAPI が読み込まれます。したがって、両方が同じ DLL を使用する場合 (たとえば、これら 2 つが共通のインフラストラクチャ実装を持っている場合)、IIS モジュールが最初に読み込まれ、ISAPI はモジュールによって読み込まれた DLL を使用する必要があります。そのため、同じバージョンの IIS モジュールと ISAPI の両方に対して共有 DLL を保持することをお勧めします。

于 2012-07-17T07:53:05.083 に答える