解説インサイド .NET Framework第1回 Managed Code/アセンブリ/モジュールインフォテリアネットワークス株式会社吉松 史彰 2002/03/30 |
プログラムが提供する詳細情報
CLRは、Managed Codeに対して、大きく分けて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 SDKには、標準で4つの言語(Visual C++ .NET(以下VC++ .NET)、VB .NET、JScript .NET、Visual C# .NET)のコンパイラが付属している。VC++ .NETを除く3つの言語のコンパイラは、必ず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回 Managed Code/アセンブリ/モジュール | ||
1.はじめに | ||
2.プログラムが提供する詳細情報 | ||
3.アセンブリとモジュールの作成 | ||
4.マルチ・モジュール・アセンブリの作成 | ||
5.マルチ・モジュール・アセンブリの必要性 | ||
「解説:インサイド .NET Framework 」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|