ソースコード→コンパイラ→マネージモジュール(ILとメタデータ)
マネージモジュール:実行するのにCLRを必要とするPE32(32bit実行可能ファイル)やPE32+(64bit)
PE32ヘッダもしくはPE32+ = ビルドされたタイムスタンプやファイルの種類を示す情報が付与される。
CLRヘッダ=マネージモジュールを生成するための情報。CLRのVersion、エントリポイントとなる(Mainメソッド)のモジュールのメタデータなど
メタデータ = すべてのマネージモジュールにはメタデータテーブルがある。ソースコード内で定義された型とメンバを記述するもの、ソースコードによって参照される型とメンバを記述する。
ILコード = ソースコードのコンパイル結果としてコンパイラが生成するコード。CLRはILをネイティブにコンパイルする。
マネージモジュールはPEヘッダ、CLRヘッダ、メタデータ、ILから構成される。
メタデータの利点
C/C++ヘッダファイルおよびライブラリが必要ない、型やメンバの情報がすべて含まれている。
IntelliSenseはメタデータを解析して、型が提供するメソッド、プロパティなどを通知する。
オブジェクトの生存期間を追跡できる。
CLRの動作
モジュールは利用せず、アセンブリを使用する。(アセンブリ = コンポーネント)
アセンブリはマネージモジュールの集合
ビルドされたアセンブリは実行可能ファイル、DLLのどちらかとなる。
JITコンパイラ:ILコードをネイティブに変換する。
ILはCPUを抽象化することができる。最大の利点はアプリケーションの堅牢性とセキュリティ
ILをネイティブにするとき、正当性検証を行う。すべてのコードが安全であることを保証する。
全てのメソッドが正しい数のパラメータを使用して呼ばれているか
型は正しいか、returnステートメントを持っているかなど
不正なメモリアドレス空間への書き込みがないことを保証する。Windowsの各プロセスを独立したアドレス空間に配置する。
NGen.exe:IL→ネイティブ、CLRのJITコンパイラが実行時にコンパイルしなくもよくなる。パフォーマンスが劣化することもある。(コード最適化がされない)
CLS:共通言語仕様
C#のメソッドをvb.netから呼ぶことを可能にする
FCLで定義されているものの多くは、Kernel32.dllやUser32.dllを内部的に呼んでいる。