JaredParの答えは良いですが、AppDomainの存在理由については言及していません。つまり、AppDomainをアンロードすることによってのみアセンブリをアンロードできます。長時間実行されているOSプロセスであり、ロードしてから後でアンロードする必要があると予想される場合、何らかの理由でアセンブリをする必要がある場合は、AppDomainが必要です。ここでの典型的な例はASP.NETです。これは、アプリコードアセンブリをオンデマンドでロードし、後でアプリがアクティブに使用されなくなったときにそれらをアンロードできます。
アンロードする機能に支払うコストは、その独立性です。AppDomainの境界を越えて通信する必要があり、単純なメソッド呼び出しを行うことはできません。AppDomainのライフサイクルを管理する必要があります。等。
アセンブリを動的にロードする必要があり、単一のプロセスの存続期間中にそれらをアンロードする必要がないと思われる場合は、おそらく複数のAppDomainを実行する必要はありません。ここでの良い例は、プラグインモデルをサポートするリッチアプリです。このアプリでは、「etc」ディレクトリ内のプラグインアセンブリをスニッフィングして、すべてをロードします。ただし、プラグインモデルでプラグインのアンロードが必要な場合は...まあ。
異常なシナリオがあります。同様に、2つの異なるバージョンのアセンブリを同時にロードするとします。AppDomainsでそれらを分離しないと、落とし穴に遭遇する可能性があります。しかし、それはかなりまれです。
AppDomainの存在を正当化するコアシナリオは、アセンブリをアンロードできなければならない長時間実行プロセスです。
もちろん、アセンブリをアンロードする場合、アプリケーションはOSプロセスに依存する可能性があります。つまり、3つまたは4つの協調プロセスを実行し、それぞれに独自のアセンブリセットを設定し、アセンブリをアンロードする場合は、そのアセンブリをホストするプロセスをシャットダウンするだけです。ただし、AppDomainは、プロセスの停止/開始やクロスプロセス通信を必要とせずに、これを行うためのより高いパフォーマンスのメカニズムを提供します。これは、前述のクロスAppDomain通信よりもさらに重いものです。私はそれがまだリモーティングしていることを意味しますが、それはより遅く、より多くのコンテキスト切り替えです。