解説

インサイド .NET Framework [改訂版]

第1回 マネージ・コード/アセンブリ/モジュール

吉松 史彰
2003/06/25
Page1 Page2 Page3 Page4 Page5

プログラムが提供する詳細情報

 CLRは、マネージ・コードに対して、大きく分けて2つの情報を持っていることを要求する。1つはいうまでもなく実行可能コードである。CLRは、IL(Intermediate Language(中間言語)。MSIL、CIL:Common Intermediate Languageともいう)と呼ばれるコードを実行可能コードとして認識する。ILは特定のプラットフォームに依存しない中間言語で、最終的には使用するプラットフォームのネイティブ・コードに変換されて実行される。

 もう1つは、その実行可能コードに関する「すべて」の情報である。「すべて」とは、

  • プログラムには、どんな型が含まれているのか。その中の、どれが外部に公開されているのか。どんなローカル変数を使うのか。どんなメソッドがどんな引数を取るのか。
  • プログラムは、外部のどんな型を利用するのか。
  • プログラムは、コンピュータに害を及ぼしかねない作業のうち、何と何を行うのか。
  • プログラムは、スタックのスロットをいくつ使うのか。

などなど。これらの情報は、モジュールの中にメタデータとして記述されている。「メタデータ」は一般名詞だが、CLRでは、読み取ることができるメタデータの形式を定義しているので、ここでいうメタデータは、CLRに対して掲示するための形式で記述された情報である。

 このような詳細情報を頼りに、CLRは実行可能コードを自分の管理下で実行する。

モジュール

 ILとメタデータは、.NET Frameworkにおける「モジュール」の中に書き込まれる。モジュールとは、Win32の世界で一般に使われている、PE(Portable Executable)形式のファイル、またはそのインメモリ・データである*2。プログラムの実行時、CLRは、(最終的には)モジュールをロードして、ILとメタデータを読み込む。

 モジュールを作る方法は、これまでと同じで、プログラム・ソースをコンパイルすることである。.NET Framework 1.1のSDKには、標準で5つの言語(Visual C++ .NET(以下VC++ .NET)、VB.NET、JScript .NET、Visual C# .NET、Visual J# .NET)のコンパイラが付属している。VC++ .NETを除く4つの言語のコンパイラは、必ずCLRのモジュールを出力する。VC++ .NETのコンパイラ(cl.exe)は、CLRのモジュールを出力するための、/clrというオプションを持っている。これが付いていない場合は、通常のx86ネイティブ・コードを出力する。

 .NET Frameworkに対応し、CLR上で実行されることを意図して作られるコンパイラの仕事は、CLRのモジュールを出力することである。コンパイラは、ソース・コードを解析して、適宜命令をILに置き換えていくとともに、その命令に付随する情報をメタデータとして記録する。出力されたモジュールには、そのモジュールについてのすべての情報が、名札代わりに含まれているということになる。

 Windowsから見れば実行可能(PE)な形式であるモジュールだが、残念ながらCLRはモジュールを直接ロードすることはできない。

*2 PEとは、Windows上で「実行可能」として識別されるバイナリ・データである。CLRのモジュールはPE形式なので、CLRの導入に伴ってWindowsに変更を加えなくても、これまでどおりに実行可能ファイルとして認識される。

アセンブリ

 CLRはモジュールではなくアセンブリをロードし、実行する。例えばエクスプローラで.EXEファイルがダブルクリックされると、アセンブリがロードされ、実行される。その.EXEファイルがほかのアセンブリをロードし、実行することもできる。

 アセンブリとは、複数のモジュールがまとまったものである。モジュールは、物理的なファイルやインメモリのデータ、つまり具体的なビット・データを表している。一方アセンブリは、複数の物理的なモジュールをまとめる論理的な情報である。アセンブリそのものには実体がない。アセンブリには複数のモジュールが含まれることがあるが、1つのモジュールは1つのアセンブリにしか所属できない*3

アセンブリとモジュールの関係
アセンブリは複数のモジュールがまとまったものである。各モジュールは、プログラムについての情報が記述されたメタデータと、ソース・コードがコンパイルされてできるILと呼ばれる中間言語からなる。
 
*3 あるモジュール(物理ファイル)を、複数のアセンブリにメンバとして参加させることは可能だが、異なるアセンブリに所属するモジュールは、異なるモジュールと見なされ、別々にロードされる。この動きは従来のDLLとは異なる。
 

 INDEX
  解説 インサイド .NET Framework [改訂版]
  第1回 マネージ・コード/アセンブリ/モジュール
    1.はじめに
  2.プログラムが提供する詳細情報
    3.アセンブリとモジュールの作成
    4.マルチ・モジュール・アセンブリの作成
    5.マルチ・モジュール・アセンブリの必要性
 
インデックス・ページヘ  「解説:インサイド .NET Framework [改訂版]」


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 記事ランキング

本日 月間