アプリケーション ドメイン

オペレーティング システムやランタイム環境では、通常、複数のアプリケーションがなんらかの形で分離されています。 たとえば、Windows ではプロセスを使用してアプリケーションが分離されています。 このような分離は、あるアプリケーションで実行されているコードが、関係のない別のアプリケーションに悪影響をもたらさないようにするために必要です。

アプリケーション ドメインは、セキュリティ、信頼性、バージョン管理のための、またアセンブリをアンロードするための分離の境界を提供します。 通常、アプリケーション ドメインは、アプリケーションの実行前に共通言語ランタイムの起動を行うランタイム ホストによって作成されます。

このセクションのトピックでは、アプリケーション ドメインを使用してアセンブリ間を分離する方法について説明します。

この概要は、次のセクションで構成されています。

  • アプリケーションを分離する利点

  • 関連トピック

  • 参照

アプリケーションを分離する利点

これまで、同じコンピューター上で実行される複数のアプリケーションを分離するためには、プロセス境界が使用されていました。 この場合、各アプリケーションが独立のプロセスに読み込まれることで、アプリケーションは同じコンピューター上で実行されるほかのアプリケーションから分離されます。

アプリケーションが分離されるのは、メモリ アドレスがプロセスごとの相対アドレスになっていたためです。つまり、メモリ ポインターをあるプロセスから別のプロセスに渡しても、そのポインターが渡された側のプロセスでは機能しませんでした。 また、2 つのプロセス間で直接呼び出しを行うこともできませんでした。 代わりに間接的な呼び出しを行う場合は、プロキシを使用する必要がありました。

マネージ コードは、実行される前に必ず検査プロセスに渡されます (管理者が検査を省略する許可をコードに与えた場合は除きます)。 検査プロセスでは、そのコードが無効なメモリ アドレスにアクセスしたり、コードが実行されるプロセスの正常実行を妨げる原因となる動作を実行したりすることがないかどうかを確認します。 検査テストを通過したコードは、タイプ セーフであると言われます。 コードがタイプ セーフかどうかを検査するこのような機能があるため、共通言語ランタイムでは、プロセス境界と同等の高度な分離レベルを実現しながら、パフォーマンスへの影響は大幅に低く抑えることができます。

アプリケーション ドメインは、共通言語ランタイムがアプリケーション間を分離するために使用できる、より安全で柔軟性に富んだ処理単位となります。 個別のプロセスを使用する場合と同じ分離レベルを実現しながら、しかしプロセス間での呼び出しやプロセスの切り替えによるオーバーヘッドを生じることもなく、1 つのプロセス内で複数のアプリケーション ドメインを実行できます。 1 つのプロセス内で複数のアプリケーションを実行できるため、サーバーのスケーラビリティが飛躍的に向上します。

アプリケーションの分離は、アプリケーションのセキュリティを考えるうえでも重要です。 たとえば、複数のコントロールが互いのデータやリソースにアクセスできないようにして、1 つのブラウザー プロセスで複数の Web アプリケーションのコントロールを実行できます。

アプリケーション ドメインによる分離には、次の利点があります。

  • 1 つのアプリケーションで発生したエラーが、ほかのアプリケーションに影響することはありません。 タイプ セーフなコードではメモリ フォールトが発生しないため、アプリケーション ドメインを使用することで、1 つのドメインで実行されているコードが同じプロセス内のほかのアプリケーションに影響することが確実になくなります。

  • プロセス全体を停止せずに、個々のアプリケーションを停止できます。 アプリケーション ドメインを使用すると、1 つのアプリケーション内で実行されているコードをアンロードできます。

    メモメモ

    個々のアセンブリや型はアンロードできません。アンロードできるのはドメイン全体だけです。

  • 1 つのアプリケーションで実行されているコードは、ほかのアプリケーションのコードやリソースに直接アクセスできません。 共通言語ランタイムでは、異なるアプリケーション ドメインにあるオブジェクト間での直接呼び出しを禁止することで分離を実現しています。 ドメイン間で渡されるオブジェクトは、コピーされるか、またはプロキシ経由でアクセスされます。 オブジェクトがコピーされる場合、オブジェクトの呼び出しはローカル呼び出しです。 つまり、呼び出し元と参照先オブジェクトの両方が、同じアプリケーション ドメイン内にあります。 オブジェクトがプロキシ経由でアクセスされる場合は、オブジェクトの呼び出しはリモート呼び出しです。 この場合は、呼び出し元と参照先オブジェクトが別のアプリケーション ドメイン内にあります。 ドメイン間呼び出しでは、2 つのプロセス間や 2 台のコンピューター間での呼び出しと同じリモート呼び出しインフラストラクチャが使用されます。 そのため、メソッドの呼び出しが正しく JIT コンパイルされるように、参照先オブジェクトのメタデータが両方のアプリケーション ドメインから利用できることが必要です。 呼び出し元のドメインが呼び出し先オブジェクトのメタデータにアクセスできない場合、コンパイルは System.IO.FileNotFound という例外が発生して失敗する可能性があります。 詳細については、「Remote Objects」を参照してください。 ドメイン間でオブジェクトにアクセスする方法は、アクセス対象のオブジェクトによって決まります。 詳細については、MarshalByRefObject クラスのトピックを参照してください。

  • コードが影響する範囲は、そのコードが実行されるアプリケーションによって決まります。 つまり、アプリケーション ドメインは、アプリケーションのバージョン ポリシー、アクセス対象となるリモート アセンブリの位置、ドメインに読み込まれるアセンブリの場所に関する情報などの構成設定を提供します。

  • コードに与えられるアクセス許可は、そのコードが実行されるアプリケーション ドメインによって制御されます。

ページのトップへ

関連トピック

タイトル

説明

アプリケーション ドメインとアセンブリ

アプリケーション ドメインとアセンブリの関係を説明します。

アプリケーション ドメインとスレッド

アプリケーション ドメインと、オペレーティング システムのスレッドとの関係を説明します。

アプリケーション ドメインを使用したプログラミング

アプリケーション ドメインを利用したプログラミング方法を説明します。

ホストの概要

アプリケーション ドメインの作成および構成方法を説明します。

ランタイム ホスト

ランタイム ホストの使用方法を説明します。

ページのトップへ

参照

System.MarshalByRefObject

ページのトップへ