AppDomain (アプリケーション ドメイン) は、アプリケーションが実行される分離された環境です。
これらは、マネージ コードを実行するための分離、アンロード、およびセキュリティ境界を提供するのに役立ちます。
アプリケーション ドメインを使用して、プロセスを停止させる可能性のあるタスクを分離します。タスクを実行している AppDomain の状態が不安定になった場合、プロセスに影響を与えずに AppDomain をアンロードできます。これは、プロセスを再起動せずに長期間実行する必要がある場合に重要です。アプリケーション ドメインを使用して、データを共有しないタスクを分離することもできます。
アセンブリが既定のアプリケーション ドメインに読み込まれると、プロセスの実行中にメモリからアンロードできなくなります。ただし、アセンブリを読み込んで実行するために 2 つ目のアプリケーション ドメインを開くと、そのアプリケーション ドメインがアンロードされるときにアセンブリがアンロードされます。この手法を使用して、大規模な DLL をときどき使用する長時間実行プロセスのワーキング セットを最小限に抑えます。
複数のアプリケーション ドメインを 1 つのプロセスで実行できます。ただし、アプリケーション ドメインとスレッドの間には 1 対 1 の相関関係はありません。複数のスレッドが 1 つのアプリケーション ドメインに属することができます。特定のスレッドが 1 つのアプリケーション ドメインに限定されるわけではありませんが、スレッドは常に 1 つのアプリケーション ドメインで実行されます。
SO 興味のある質問:
私は AppDomains の分野の専門家であると公言するつもりはありませんが、COM オブジェクト リーク メモリ (つまり、アンマネージ メモリ) が AppDomain をアンロードしても解放されないことは確かです。おそらく、これに詳しい人がコメントするかもしれません。
Brian が指摘したように、「.NET Framework バージョン 2.0 ドメインでは、実行中のスレッドを終了できない可能性があるため、アンロードが保証されていません。」