アプリケーションドメインとは、共通言語インフラストラクチャ(CLI)内で使用されるメカニズム(オペレーティングシステムのプロセスに類似)であり、実行されるソフトウェアアプリケーション同士を分離し、互いに影響を与えないようにするものです。各アプリケーションドメインは独自の仮想アドレス空間を持ち、そのアドレス空間を使用してアプリケーションドメインのリソースの範囲を定めます。
.NET Core および .NET 5+ では、同じプロセスで複数のアプリケーション ドメインを作成することはできません。[ 1 ]
CLIアプリケーションドメインは、オペレーティングシステムプロセス内に含まれています。1つのプロセスは、複数のアプリケーションドメインを含むことができます。アプリケーションドメインは、オペレーティングシステムプロセスと同様の分離特性を持っています。
この意味で、CLIはミニオペレーティングシステムのようなものです。CLIは、複数のサブプロセス、つまりアプリケーションドメインを含む単一のプロセスを実行します。
アプリケーションドメインの利点は、複数のアプリケーションドメインを実行する場合、複数のオペレーティングシステムプロセスを実行する場合よりも、メモリなどのリソースを少なく抑えられる可能性があることです。ただし、ドメイン間の通信にはマーシャリングが必要となるため、オーバーヘッドは単一ドメイン内での通信よりも、複数のプロセスを使用する場合に近いものになる可能性があります。
アプリケーション ドメイン間で直接通信することはできません。しかし、アプリケーション ドメインは、値によるマーシャリング(非バインド オブジェクト) やプロキシを介した参照によるマーシャリング (アプリケーション ドメインにバインドされたオブジェクト) によってオブジェクトを渡すことで、相互に通信することができます。コンテキスト バインド オブジェクトと呼ばれる 3 番目のタイプのオブジェクトがあり、これはドメイン間だけでなく、自身のアプリケーション ドメインのコンテキスト内でも参照によってマーシャリングできます。マネージド コードの検証可能な型安全性により、CLI はオペレーティングシステム プロセスよりもはるかに低いコストでドメイン間の障害分離を提供できます。分離に使用される静的型検証では、オペレーティングシステム プロセスが必要とするプロセス スイッチやハードウェア リング遷移は必要ありません。
アプリケーションドメインは、純粋にマネージドコードの概念です。インクルードされるネイティブコードやアンマネージドコード(C++など)は、ほとんどこれらのドメインを認識しません。静的変数はドメイン間で共有されるようで、コールバックは問題を引き起こす可能性があり、あるドメインで発生したメモリ破損バグは他のドメインにも影響を及ぼす可能性があります。