2008-09-04 3 views
1

IIS6でホストされているWebサービスで使用されているサードパーティのDLLがあります。問題は、いったんこのdllがメモリにロードされると、それを作成したスレッドと異なるスレッドがdll内のコードを実行しようとすると例外AccessViolationExceptionがスローされることです。ワーカープロセスはマルチスレッドであり、Webサービスへの各呼び出しはプールからランダムなスレッドを取得します。私たちはそれをメモリからアンロードしようとしましたが、必要になるたびにリロードしましたが、フロントエンドだけが.Netで残りは管理されていないので、メモリから完全にアンロードされることはありません。私たちはVBと.Net 2.0を使用しています。助言がありますか?IISでコードを実行するために同じスレッドを使用する方法を教えてください。

(ロブ・ウォーカーへの対応)

私たちは、新しいスレッドを作成し、DLLを呼び出すためにそれを使用して考えたが、どのように我々は、スレッドが座って呼び出しを待つ作るのですか? .Net 3.0で提供されたDispatcherクラスを持たないスレッドへの呼び出しをどのように委譲しますか?隠れたフォームを作成し、それをメッセージループに入れることができます。そして、フォームのInvoke()メソッドを呼び出すことができます。しかし、IISでホストされているWebサービス内にフォームを作成すると、多くの問題が発生することがあります。

答えて

1

私は、ループ内にスレッドを入れて、そのスレッドを使ってメソッドを実行するためにデリゲートを使ってメソッドInvoke()を呼び出すことができると呼ばれるクラスについて読んでいます。しかし、このソリューションは、.Net 3.0にアップデートできない場合は動作しません。もう1つの解決策は、サードパーティのdllをサーバー上の別のアプリケーションでホストし、それにアクセスするために何らかの形のRemotingを使用することです。しかし、Remotingの問題は、IISと同様に動作し、コードを実行するためのランダムなスレッドを選択するため、依然として問題がある可能性があります。この問題を回避するには、DLLの周りにラッパーを置いて、フォームのInvoke()メソッドを使用して呼び出しをUIスレッドに委任することができます。

1

私は、DLLへのすべての呼び出しを処理するラッパースレッドを使用して、シリアライゼーションを処理する必要があると考えます。

このスレッドは管理対象スレッドプールの外にあるため、そのスレッドの有効期間を制御します。 WebサービスがあるアプリケーションドメインをIISが再起動しないようにすることができない限り、これでも絶対になるわけではありません。

また、2つのWebサービスリクエストが同時に来るときに何が起こるか心配する必要があります。 DLLへの各呼び出しはスタンドアロンか、他の要求を処理する前に単一のWebサービス要求に関連付けられたすべての呼び出しをグループ化する必要がありますか?

0

余分なDLLをホストするサービスを作成することができます。リモートを介してサービスにアクセスすると、DLLを管理するスレッドにコールがディスパッチされます。

この方法では、DLLを呼び出すスレッドを制御し、スレッドの有効期間にわたって制御できます。

0

私はちょっと錆びますが、スレッドアパートメントCOMオブジェクトのDLLへの呼び出しをラップすることもできます。これにより、すべての呼び出しがCOMオブジェクトのWindowsメッセージングスレッドを通過することが保証されます。私はこれを行うには、コンポーネントサービス内のサーバーアプリケーションにコンポーネントを登録する必要があると思います。

0

dllを別のスレッドとして別のスレッドとして実行できますか? thread1と同様に、このサードパーティのDLLのインスタンスを作成しますが、thread2もそうですが、thread1がthread2のインスタンスを使用しようとしない限り、その例外はスローされません。その場合、.Netはロードされた後に決してコードをアンロードしません。アセンブリをロードしてからそれを削除すると、そのアプリケーションプールにまだ置かれます。一度に複数のインスタンスを作成できる場合は、リクエストごとに別々のアプリケーションプールにロードし、アプリケーションプールをアンロードします。パフォーマンスは低下するかもしれません。

関連する問題