.NET Framework のアーキテクチャ

 .NET Framework は、プラットフォーム層(OS や、モバイルデバイスなどの各種デバイス)の上で実行される共通言語ランタイム(CLR)と、そのランタイムの上で実行されるアセンブリ(またはクラスライブラリ)という2 つの主要なコンポーネントで構成されます。

図1●.NET Framework における動作の概念
図1●.NET Framework における動作の概念
[画像のクリックで拡大表示]

 ここでは、これらの各コンポーネントについてその役割と基本概念を説明します。

共通言語ランタイム(CLR)

 共通言語ランタイム(Common Language Runtime : CLR)は、.NET Framework の基礎となるコンポーネントです。.NET Frameworkがインストールされているすべての環境には、ソフトウェアの実行環境に関するCLI(Common Language Infrastructure)と呼ばれる仕様に準拠した実行エンジン(実装系)が必ず必要になります。共通言語ランタイム(CLR)は、このCLIに準拠した代表的な実装系の1 つです。

■Note
 Windows 環境では、ほとんどの場合、この共通言語ランタイム(CLR)を使用します。しかし、Linux OS や、CLR が存在しない専用デバイスなどでは、サードパーティによるCLI の実装が使用されることがあります。

 通常、プログラマがC 言語などで作成してコンパイルした内容は、機械語(マシンコード)と呼ばれるプロセッサ(CPU)が実行可能な形式に変換され、ファイル(バイナリイメージ)として生成されます。しかし、.NET Frameworkのコンパイラは、上記の共通言語ランタイム(CLR)が解釈可能な中間言語(Intermediate Language : IL)のコードを含んだ専用のポータブル実行可能ファイル(PE ファイル)(※1)を作成します(以降の記述では、この論理的なモジュールのことを「アセンブリ」と呼びます)。

※1 .exe ファイル、.dll ファイルなどのWindows 上の実行可能ファイルは、決められたヘッダー情報などを持ったポータブル実行可能ファイル(PE ファイル)という形式に準拠している必要があります。

 つまり、.NET Frameworkの実行可能ファイルが動作する際は、実際には共通言語ランタイム(CLR)がこの実行可能ファイル(アセンブリ)の中の中間言語(IL)で記述された処理を読み込んで処理しています。これにより、.NET Framework では、OS やCPU アーキテクチャなどのプラットフォーム、デバイスに関係なく、CLR が動作する環境であれば、どこでも同様に実行可能ファイルを動作させることができます。

■Note
 このように記述すると.NET Framework は、UNIX シェルスクリプトなどのインタープリタ方式と同様の方式で動作していると誤解されるかもしれませんが、実際にはパフォーマンスを考慮し、実行時にJIT(Just-In-Time)コンパイラを使用して中間言語(IL)に記述された処理をプロセッサが読み込めるネイティブイメージにコンパイルしてメモリ上に配置してから動作しています。
■Note
 パフォーマンスをより重視したい場合には、.NET Framework SDK に付属のネイティブイメージジェネレータ(Ngen.exe)を使用して、プロセッサ固有のマシンコードを含むネイティブイメージをあらかじめ作成することもできます(ただし、このファイルを別のプラットフォーム上に遷移した場合には、このネイティブイメージは無効化され、IL を使って再生成されます)。
 また、特別な理由で、アーキテクチャ(x86、x64 などのCPU アーキテクチャ)を制限したい場合(たとえば、内部で使用しているライブラリが特定のアーキテクチャしかサポートしていない場合、など)には、実行可能なアーキテクチャを限定してアセンブリを作成(コンパイル)することも可能です。