アプリケーション ドメインの作成および構成

前のセクションで説明した基準に従って、ホストはドメイン境界をどこに設定するかを決定すると、System.AppDomain 型の CreateDomain メソッドを使って、ユーザー コードを実行するためのドメインを作成します。各アプリケーション ドメインには、名前と値の組み合わせのコレクションがあります。ホストはそのコレクションにドメインに関する情報を保存できます。名前と値の組み合わせは、パラメータとして CreateDomain に渡されます。

.NET Framework では、このランタイムがネイティブに理解できる多くのプロパティが定義されています。これらのプロパティの名前は、System.AppDomain クラス内の静的文字列で定義されています。ホストは、アプリケーション ドメインをカスタマイズするために、ネイティブに理解できるプロパティを設定できます。たとえば、これらのプロパティは、異なるドメインで実行されているコードを分離する方法を制御できます。名前と値の組み合わせは、ホストが使用事例に応じた固有の情報を保存するカスタム プロパティを定義できるように拡張できます。

一般に、アプリケーション ドメインが行う分離は、次の 2 つの形態を取ります。

  • アプリケーション ドメインは、あるアプリケーション ドメイン内の型が別のドメイン内の型を参照したり、呼び出したりすることを防ぐことにより、あるドメインで実行されているコードが他のドメインに影響を与えることを防ぎます。アプリケーション ドメインは、メモリ フォールトを防ぐために、コードが検査されていることを前提にしています。

  • ホストは、特定のアプリケーション ドメインに読み込むコードをランタイムがどこから取得するかを制御します。これは、1 つのアプリケーションのコードが誤って他のアプリケーションに影響を与えることを防ぐために重要です。この方法でコードの読み込み要求の対象範囲を限定する機能は、Microsoft の Win32 や COM で現在動作している方法とはまったく異なります。現在の Windows では、解決スコープはコンピュータ全体です。これは、すべてのアプリケーションが、レジストリに記述されているコードや、Windows のシステム ディレクトリのような周知の場所に配置されたコードを使用できるためです。この方法による共有は現在の既定の設定であり、この動作が DLL 競合の原因の 1 つとなっています。

コードを読み込むためのスコープを確立するほかに、構成情報のスコープを 1 つのアプリケーションに限定することも重要です。ただし、現時点では、この方法を適用できない構成設定も多数あります。

たとえば、COM クラスを実行するリモートのコンピュータを構成する場合、レジストリの RemoteServerName キーを特定のクラスに対して設定すると、この設定はそのクラスを使用するすべてのアプリケーションに影響します。意図しないコードの共有と同様に、意図しない構成データの共有も、アプリケーションが自身の動作を完全に制御できなくなる原因になります。

System.AppDomainFlags.ApplicationBase プロパティおよび System.AppDomainFlags.ConfigurationFile プロパティは、それぞれ、ランタイムがアセンブリを検索するディレクトリを指定する機能と、特定のアプリケーション ドメインに対する構成設定の適用範囲を確立するディレクトリを指定する機能を制御します。

ApplicationBase プロパティは、ランタイムがプライベート アセンブリを検索する、アプリケーション ドメインのルート ディレクトリを確立します。ホストがディスクからのアセンブリの読み込みを許可する場合は、読み込むアセンブリの検索場所をこのランタイムが認識できるように、ApplicationBase プロパティを設定する必要があります。

ConfigurationFile プロパティには、アプリケーション ドメインで実行されるアプリケーションを構成するために使用される設定を含む XML ファイルの名前を指定します。アプリケーション構成ファイルでの設定の例としては、アセンブリのバージョン管理規則や、アプリケーション ドメインで実行される型によってリモートでアクセスできる型を検索するための指示などがあります。

アプリケーション ドメインの構成に利用できるその他のプロパティの説明については、AppDomain クラスのドキュメントを参照してください。

セキュリティに関するメモ   AppDomainSetup.DisallowCodeDownload プロパティの既定値は false です。この設定はサービスについて安全ではありません。部分的に信頼されたコードをサービスがダウンロードしないようにするには、このプロパティを true に設定します。

参照

関連項目

AppDomain

その他の技術情報

共通言語ランタイムのホスト