MSIL からネイティブ コードへのコンパイル

MSIL (Microsoft Intermediate Language) は、実行する前に .NET Framework の Just-In-Time (JIT) コンパイラによってネイティブ コードに変換する必要があります。ネイティブ コードは CPU 固有のコードで、JIT コンパイラと同じコンピュータ アーキテクチャ上で実行されます。共通言語ランタイムはサポートしている CPU アーキテクチャごとに JIT コンパイラを提供しているため、開発者は 1 セットの MSIL を記述して JIT コンパイルし、異なるアーキテクチャの複数のコンピュータ上で実行できます。ただし、マネージ コードがプラットフォーム固有のネイティブ API またはプラットフォーム固有のクラス ライブラリを呼び出す場合、そのコードは特定のオペレーティング システムでしか実行できません。

JIT コンパイルは、実行時に呼び出されることがないコードがあることを考慮しています。つまり、ポータブル実行可能 (PE) ファイル内にあるすべての MSIL をネイディブ コードに変換するために時間とメモリを費やすのではなく、実行時に必要になった MSIL を変換し、その結果生成されたネイティブ コードを保存して、以降の呼び出しで利用できるようにしておきます。型が読み込まれると、ローダーはスタブを作成し、その型の各メソッドに結び付けます。メソッドが初めて呼び出されると、スタブは JIT コンパイラに制御を渡し、JIT コンパイラがそのメソッドの MSIL をネイティブ コードに変換し、そのネイティブ コードを直接実行するようにスタブを変更します。それ以降は、この JIT コンパイル済みのメソッドを呼び出すと生成済みのネイティブ コードが直接実行され、JIT コンパイルとコードの実行に必要な時間を節約できます。

共通言語ランタイムには、インストール時コード生成と呼ばれる別のコンパイル モードも用意されています。インストール時コード生成モードは標準の JIT コンパイラと同じ方法で MSIL をネイティブ コードに変換しますが、より大きなコード単位を一度に変換し、生成したネイティブ コードを後からアセンブリが読み込まれて実行されるときに使用できるように保存しておきます。インストール時コード生成を使用すると、既にインストールされている他のアセンブリに関する情報を考慮しながら、インストール中のアセンブリ全体がネイティブ コードに変換されます。インストール時コード生成で生成されたファイルは、標準の JIT オプションでネイティブ コードに変換された場合よりもすばやく読み込まれて起動されます。

コードの検証を省略できるようにするセキュリティ ポリシーを管理者が設定していない限り、MSIL からネイティブ コードへのコンパイル時に、コードは検証プロセスを通過する必要があります。この検証プロセスでは、コードがタイプ セーフかどうかを確認するために、MSIL とメタデータが調べられます。タイプ セーフなコードとは、アクセス権限を与えられているメモリ位置だけにアクセスするコードを意味します。タイプ セーフは、オブジェクトどうしを分離するため、不注意や悪意による破損からオブジェクトを保護することに役立ちます。また、コードに対するセキュリティ制限が強制適用されることも保証されます。

共通言語ランタイムは、検証可能なタイプ セーフ コードが次の条件を満たすことを前提としています。

  • 型への参照には参照される型との間に完全な互換性がある。

  • 適切に定義された操作だけがオブジェクトに対して呼び出される。

  • ID が正しい。

検証プロセスでは、MSIL コードが調べられ、適切に定義された型だけを使用してメモリ位置にアクセスしたりメソッドを呼び出したりするかどうかが確認されます。たとえば、オブジェクトのフィールドにアクセスするときにメモリ位置をオーバーランできるようなコードは許可されません。また、不正な MSIL があるとタイプ セーフ規則に違反する可能性があるため、MSIL が正しく生成されているかどうかも調べられます。検証プロセスは適切に定義されたタイプ セーフ コードのセットを許可します。許可されるコードはタイプ セーフなコードだけです。ただし、タイプ セーフなコードの中にも、検証プロセスの制限によって検証を通過しないコードがあります。また、言語によっては、デザイン上、検証可能なタイプ セーフ コードが生成されない場合もあります。セキュリティ ポリシーがタイプ セーフなコードを必要とするにもかかわらず、コードが検証を通過しなかった場合は、そのコードを実行したときに例外がスローされます。

参照

概念

マネージ実行プロセス