アプリケーション ドメインの概要
これまで、同じコンピュータ上で実行される複数のアプリケーションを分離するためには、プロセス境界が使用されていました。この場合、各アプリケーションが独立のプロセスに読み込まれることで、アプリケーションは同じコンピュータ上で実行されるほかのアプリケーションから分離されます。
アプリケーションが分離されるのは、メモリ アドレスがプロセスごとの相対アドレスになっていたためです。つまり、メモリ ポインタをあるプロセスから別のプロセスに渡しても、そのポインタが渡された側のプロセスでは機能しませんでした。また、2 つのプロセス間で直接呼び出しを行うこともできませんでした。代わりに間接的な呼び出しを行う場合は、プロキシを使用する必要がありました。
マネージ コードは、実行される前に必ず検査プロセスに渡されます (管理者が検査を省略する許可をコードに与えた場合は除きます)。検査プロセスでは、そのコードが無効なメモリ アドレスにアクセスしたり、コードが実行されるプロセスの正常実行を妨げる原因となる動作を実行したりすることがないかどうかを確認します。検査テストを通過したコードは、タイプ セーフであると言われます。コードがタイプ セーフかどうかを検査するこのような機能があるため、共通言語ランタイムでは、プロセス境界と同等の高度な分離レベルを実現しながら、パフォーマンスへの影響は大幅に低く抑えることができます。
アプリケーション ドメインは、共通言語ランタイムがアプリケーション間を分離するために使用できる、より安全で柔軟性に富んだ処理単位となります。個別のプロセスを使用する場合と同じ分離レベルを実現しながら、しかしプロセス間での呼び出しやプロセスの切り替えによるオーバーヘッドを生じることもなく、1 つのプロセス内で複数のアプリケーション ドメインを実行できます。1 つのプロセス内で複数のアプリケーションを実行できるため、サーバーのスケーラビリティが飛躍的に向上します。
アプリケーションの分離は、アプリケーションのセキュリティを考えるうえでも重要です。たとえば、複数のコントロールが互いのデータやリソースにアクセスできないようにして、1 つのブラウザ プロセスで複数の Web アプリケーションのコントロールを実行できます。
アプリケーション ドメインによる分離には、次の利点があります。
1 つのアプリケーションで発生したエラーが、ほかのアプリケーションに影響することはありません。タイプ セーフなコードではメモリ フォールトが発生しないため、アプリケーション ドメインを使用することで、1 つのドメインで実行されているコードが同じプロセス内のほかのアプリケーションに影響することが確実になくなります。
プロセス全体を停止せずに、個々のアプリケーションを停止できます。アプリケーション ドメインを使用すると、1 つのアプリケーション内で実行されているコードをアンロードできます。
メモ : 個々のアセンブリや型はアンロードできません。アンロードできるのはドメイン全体だけです。
1 つのアプリケーションで実行されているコードは、ほかのアプリケーションのコードやリソースに直接アクセスできません。共通言語ランタイムでは、異なるアプリケーション ドメインにあるオブジェクト間での直接呼び出しを禁止することで分離を実現しています。ドメイン間で渡されるオブジェクトは、コピーされるか、またはプロキシ経由でアクセスされます。オブジェクトがコピーされる場合、オブジェクトの呼び出しはローカル呼び出しです。つまり、呼び出し元と参照先オブジェクトの両方が、同じアプリケーション ドメイン内にあります。オブジェクトがプロキシ経由でアクセスされる場合は、オブジェクトの呼び出しはリモート呼び出しです。この場合は、呼び出し元と参照先オブジェクトが別のアプリケーション ドメイン内にあります。ドメイン間呼び出しでは、2 つのプロセス間や 2 台のコンピュータ間での呼び出しと同じリモート呼び出しインフラストラクチャが使用されます。そのため、メソッドの呼び出しが正しく JIT コンパイルされるように、参照先オブジェクトのメタデータが両方のアプリケーション ドメインから利用できることが必要です。呼び出し元のドメインが呼び出し先オブジェクトのメタデータにアクセスできない場合、コンパイルは System.IO.FileNotFound という例外が発生して失敗する可能性があります。詳細については、「リモート オブジェクト」を参照してください。ドメイン間でオブジェクトにアクセスする方法は、アクセス対象のオブジェクトによって決まります。詳細については、MarshalByRefObject クラスのトピックを参照してください。
コードが影響する範囲は、そのコードが実行されるアプリケーションによって決まります。つまり、アプリケーション ドメインは、アプリケーションのバージョン ポリシー、アクセス対象となるリモート アセンブリの位置、ドメインに読み込まれるアセンブリの場所に関する情報などの構成設定を提供します。
コードに与えられるアクセス許可は、そのコードが実行されるアプリケーション ドメインによって制御されます。