1

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

(ロブウォーカーへの応答)

新しいスレッドを作成し、それを使用してdllを呼び出すことを検討しましたが、スレッドを停止させて呼び出しを待機するにはどうすればよいですか?.Net 3.0で提供されるDispatcherクラスを使用せずに、どのようにして呼び出しをスレッドに委任しますか?非表示のフォームを作成してメッセージループに入れるとうまくいく場合があります。次に、フォームのInvoke()メソッドを呼び出すことができます。しかし、IISでホストされているWebサービス内にフォームを作成すると、多くの問題が発生することがわかります。

4

5 に答える 5

1

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

于 2008-09-04T19:12:11.180 に答える
1

DLL へのすべての呼び出しを処理し、シリアル化を処理するラッパー スレッドの使用を検討する必要があると思います。

このスレッドはマネージド スレッド プールの外部にあるため、その有効期間を制御します。ただし、IIS が Web サービスが存在するアプリ ドメインを再起動するのを防ぐことができない限り、これでも絶対確実ではありません。

また、2 つの Web サービス要求が同時に入ってきた場合にどうなるかについても考慮する必要があります。DLL への各呼び出しはスタンドアロンですか? それとも、他の要求を処理できるようにする前に、1 つの Web サービス要求に関連付けられているすべての呼び出しをグループ化する必要がありますか?

于 2008-09-04T19:24:30.370 に答える
0

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

于 2008-10-07T08:02:02.720 に答える
0

追加の DLL をホストするサービスを作成できます。リモート処理を介してサービスにアクセスすると、DLL を管理するスレッドに呼び出しがディスパッチされます。

このようにして、DLL を呼び出すスレッドとスレッドの存続期間を制御できます。

于 2008-10-06T14:00:39.423 に答える
0

異なるインスタンスとして異なるスレッド内で dll を実行できますか? スレッド 1 がこのサード パーティの dll のインスタンスを作成するように、スレッド 2 も作成しますが、スレッド 1 がスレッド 2 のインスタンスを使用しようとしない限り、その例外はスローされませんか? その場合、.Net は一度読み込まれたコードをアンロードしません。アセンブリを読み込んでから削除しても、そのアプリケーション プールに残ります。一度に複数のインスタンスを作成できる場合は、リクエストごとに制御する別のアプリ プールにインスタンスをロードしてから、アプリ プールをアンロードできます。ただし、パフォーマンスが低下する可能性があります。

于 2008-11-02T03:56:49.280 に答える