連載:明解.NETテクノロジ

アプリケーション・ドメイン
Application Domain

吉松 史彰
2003/10/22
Page1 Page2

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

 このように共通言語ランタイム上で動作するコードは、メモリをむやみに破壊するコードを実行できない。それならば、メモリ空間を分離することでシステムの堅牢性を維持する機能は必要ないことになる。つまり、共通言語ランタイム上では、1つのプロセスの内部で複数の「アプリケーション」を実行できるようにしても、かつてのWindows 3.1のように、システムの安定度が下がることはない。そこで、.NET Frameworkでは、1つのプロセスの中に複数の「アプリケーション」をロードし、実行する機能を提供することにした。

 ところで、Windowsのプロセスはメモリだけを管理する単位ではない。セキュリティやファイルなどのリソースも管理対象である。共通言語ランタイムでは、型の安全性によってメモリの問題は解決したが、セキュリティの問題まで解決できたわけではない。依然として、共通言語ランタイム上で動作するアプリケーションにも、個別にセキュリティを設定できる機能が必要である。そこで、共通言語ランタイムでは、共通言語ランタイム版プロセスとでもいうべき機能が導入された。それが「アプリケーション・ドメイン」である。アプリケーション・ドメインは、共通言語ランタイム上で利用される型やセキュリティを管理する単位である。

アプリケーション・ドメインとプロセス
共通言語ランタイム上では1つのプロセスの内部で複数の「アプリケーション」が実行可能となった。個々のアプリケーションは「アプリケーション・ドメイン」と呼ばれる処理単位でその型やセキュリティが管理され、独立して実行される。

 あるプロセスに共通言語ランタイムをロードして初期化すると、デフォルトのアプリケーション・ドメインが1つ作成される。例えば次のようなC#のプログラムをコンパイルして実行すると、そのコードはデフォルトのアプリケーション・ドメイン内部で実行される。

class App {
  static void Main() {
    System.Console.WriteLine("hello, world");
  }
}

 アプリケーション・ドメインの機能は、.NET Frameworkクラス・ライブラリに含まれるAppDomainクラス(System名前空間)を通して利用できる。例えば、現在コードが実行されているアプリケーション・ドメインを取得したい場合は、次のコードを記述する。

System.AppDomain ad = System.AppDomain.CurrentDomain;

 現在コードが実行されているプロセスと同じプロセスに新しくアプリケーション・ドメインを作成し、新しいドメイン内部でコードを実行するには、次のようにExecuteAssemblyメソッドを実行する方法がある。このメソッドに引数として渡す文字列はファイル名であり、ファイルにはMainメソッドを含む実行可能なアセンブリが格納されていなければならない(アセンブリのプライマリ・モジュール*1の名前でなければならない)。

*1 アセンブリのプライマリ・モジュールに関しては、「連載:インサイド.NET Framework」の「第3回 アセンブリのロード」で解説している。

 また、新しいアプリケーション・ドメインはCreateDomainメソッドで作成する。

class App2 {
  static void Main() {
    System.Console.WriteLine("App2!");
  }
}
// コンパイル方法:csc /debug app2.cs
サンプル・プログラム(app2.cs)
 
class App3 {
  static void Main() {
    System.Console.WriteLine("hello, world");
    System.AppDomain ad
        = System.AppDomain.CreateDomain("子ドメイン");
    ad.ExecuteAssembly("app2.exe");
  }
}
// コンパイル方法:csc /debug app3.cs
サンプル・プログラム(app3.cs)
「子ドメイン」という名前のアプリケーション・ドメインを作成し、そこでapp2.exeを実行する。

 app3.exeを実行すると、画面には「hello, world」と「App2!」が表示される。App3クラスのMainメソッドを最後の行まで実行した後でデバッガにより確認すると、次のようにアプリケーション・ドメインがロードされている様子が分かる。

デバッガ「Cordbg.exe」によるアプリケーション・ドメインの表示
Cordbg.exeは.NET Framework SDKに付属するコマンドライン版のデバッグ・ツール。このツールを使用すれば実行中のプロセスに含まれるアプリケーション・ドメインやモジュールを列挙できる。
  デバッガを起動し、デバッガ上でapp3.exeを実行する
  Mainメソッドの最後の行にブレイク・ポイントを設定
  設定したブレイク・ポイントまでプログラムを実行
  アプリケーション・ドメインの表示
  app3.exeにより作成されたアプリケーション・ドメイン。ここでapp2.exeが実行されているのが分かる
  app3.exeが実行されたときに作成されたデフォルトのアプリケーション・ドメイン

 このように共通言語ランタイムでは、1つのプロセスの内部で複数の「アプリケーション」を動作させることができる。アプリケーション・ドメインは、共通言語ランタイム上で動作するアプリケーションにとってのプロセス空間なのである。End of Article

 

 INDEX
  明解.NETテクノロジ
  アプリケーション・ドメイン Application Domain
    1.従来のプロセスの成り立ち
  2.共通言語ランタイム版プロセス - アプリケーション・ドメイン
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間