13

メモリ リークがあり、実行時間の長いプロセス内でシングル スレッド アパートメント [STA] を使用する、不適切に作成されたサード パーティの COM コンポーネントを呼び出す必要があります。

別のプロセスがそれを実装するための良い方法であることを知っており、長時間実行されているプロセスから時々再起動できます。

代わりに AppDomain を使用できますか? 適切にマークされている場合、AppDomain スレッドは STA スレッドですか? COM オブジェクト用の独自のメモリはありますか? AppDomain をアンロードすることは、プロセスを強制終了することと同じですか?

4

2 に答える 2

24

AppDomain は、プロセスと同じ程度の分離を提供しません。実際、サード パーティのコンポーネントが適切な状態ではないことを心配している場合は、.NET アプリケーションがダウンするリスクがあります。

アンロード時にアンマネージ コードが実行されている場合、AppDomain をアンロードできないため、AppDomain でサード パーティ コードを制御するのに苦労する可能性があります。http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspxを参照してください。

マネージ コードのみの場合でも、AppDomain は堅牢なサンドボックス ソリューションを提供しません。たとえば、ロードされたコードがスレッドを生成した場合、未処理の例外が発生した場合、これらはプロセス全体を停止します。この質問にはもう少し情報があります: .NET - "catch all exceptions handler" を実装する最良の方法は何ですか

私の知る限り、.NET アプリケーションでそのようなコードをホストするための最良のオプションは、IIS や SQL Server のように独自の CLR ホスト プロセスを実装することです。

于 2009-08-10T05:43:07.387 に答える
0

AppDomain (アプリケーション ドメイン) は、アプリケーションが実行される分離された環境です。

これらは、マネージ コードを実行するための分離、アンロード、およびセキュリティ境界を提供するのに役立ちます。

  • アプリケーション ドメインを使用して、プロセスを停止させる可能性のあるタスクを分離します。タスクを実行している AppDomain の状態が不安定になった場合、プロセスに影響を与えずに AppDomain をアンロードできます。これは、プロセスを再起動せずに長期間実行する必要がある場合に重要です。アプリケーション ドメインを使用して、データを共有しないタスクを分離することもできます。

  • アセンブリが既定のアプリケーション ドメインに読み込まれると、プロセスの実行中にメモリからアンロードできなくなります。ただし、アセンブリを読み込んで実行するために 2 つ目のアプリケーション ドメインを開くと、そのアプリケーション ドメインがアンロードされるときにアセンブリがアンロードされます。この手法を使用して、大規模な DLL をときどき使用する長時間実行プロセスのワーキング セットを最小限に抑えます。

複数のアプリケーション ドメインを 1 つのプロセスで実行できます。ただし、アプリケーション ドメインとスレッドの間には 1 対 1 の相関関係はありません。複数のスレッドが 1 つのアプリケーション ドメインに属することができます。特定のスレッドが 1 つのアプリケーション ドメインに限定されるわけではありませんが、スレッドは常に 1 つのアプリケーション ドメインで実行されます。

SO 興味のある質問:

私は AppDomains の分野の専門家であると公言するつもりはありませんが、COM オブジェクト リーク メモリ (つまり、アンマネージ メモリ) が AppDomain をアンロードしても解放されないことは確かです。おそらく、これに詳しい人がコメントするかもしれません。

Brian が指摘したように、「.NET Framework バージョン 2.0 ドメインでは、実行中のスレッドを終了できない可能性があるため、アンロードが保証されていません。」

于 2009-08-10T05:32:18.077 に答える