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

[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]

Microsoft 中間言語 (MSIL)、実行する前に、共通言語ランタイムをターゲット コンピュータのアーキテクチャのネイティブ コードに対してコンパイルする必要があります。 .NET Framework には、この変換を実行する 2 つの方法が用意されています。

ジャスト イン タイム コンパイラでコンパイル

JIT コンパイル関数では MSIL ネイティブ コード実行時、アセンブリの内容が読み込まれ、実行されるアプリケーションでオンデマンドに変換します。 共通言語ランタイムはサポートされている CPU アーキテクチャごとに JIT コンパイラを提供、ため開発者が JIT コンパイルされたいて別のコンピュータ アーキテクチャの別のコンピュータで実行された MSIL アセンブリのセットの構築ことができます。 ただし、マネージ コードが実行、特定のオペレーティング システムでのみプラットフォーム固有のネイティブ API、またはプラットフォーム固有のクラス ライブラリを呼び出す、場合。

JIT コンパイル考慮いくつかのコード可能性があります実行中に呼び出さを取得しないことという事実。 使用して時間とメモリに変換するポータブル実行可能 (PE) ファイル内のすべての MSIL をネイティブ コードではなく、実行中に必要に応じて、MSIL を変換し、生成されたネイティブ コードに格納メモリそのプロセスのコンテキストで呼び出されるアクセス可能になるようします。 ローダーは作成し、種類が読み込まれ、初期化に、型で各メソッドにスタブを結び付けます。 メソッドが最初に呼び出されると、スタブによってネイティブ コードにメソッドの MSIL に変換され、生成されたネイティブ コードを直接ポイントするスタブを変更、JIT コンパイラに制御が渡されます。 JIT コンパイルされたメソッドの呼び出し後は、したがって、ネイティブ コードに直接進みます。

NGen.exe を使用してインストール時コード生成

JIT コンパイラでアセンブリの MSIL をネイティブ コードを変換して個々 のメソッド定義アセンブリは呼び出されるでとき、されるため、必ずしもに、パフォーマンスの実行時にへの影響をする必要があります。 ほとんどの場合、そのパフォーマンスに影響が許容します。 重要な点は、JIT コンパイラによって生成されたコードは、コンパイルをトリガするプロセスにバインドします。 複数のプロセス間で共有できません。 共通言語ランタイム、先読み-の-時刻のコンパイル モードをできるようにするに、アプリケーションの複数の呼び出しまたは一連のアセンブリを共有する複数のプロセス間で共有する生成されたコードは、サポートしています。 はこの先読み-の-時刻のコンパイル モード、Ngen.exe (Native Image Generator) を使用して MSIL アセンブリに変換、JIT コンパイラでと同様に非常にネイティブ コード。 ただし、Ngen.exe の操作異なります次の 3 つの方法で、JIT コンパイラの。

  • 変換 MSIL をネイティブ コードに、アプリケーションの実行中にではなくする前に実行されます。

  • 一度に全体アセンブリ、代わりにでメソッドをコンパイルします。

  • ファイルとしてディスク上のネイティブ イメージ キャッシュ内で生成されたコードが引き続き発生します。

コードの確認

MSIL をネイティブ コードにコンパイルの一環として、MSIL コード渡す必要があります、検証処理、管理者がセキュリティ ポリシーを検証をバイパスする、コードでを確立しない限り。 検証が MSIL に調べ確認かどうか、コードがタイプ セーフ、メモリ ロケーションをのみにアクセスする、つまりするメタデータにアクセスする権限がします。 タイプ セーフ互いのオブジェクトの分離し、ためできます誤ってまたは悪意のある破損を防ぐにします。 また、コードにセキュリティ制限を確実に適用することの保証を提供します。

ランタイムは、次のコードがタイプ セーフ検証可能がコードに当てはまりますが依存します。

  • 型への参照は参照される型と厳密互換性があります。

  • 唯一の適切に定義された操作は、オブジェクトに対して呼び出されます。

  • ID に要求します。

検証処理中に、MSIL コードことを確認、コードはメモリ ロケーションへのアクセス正しく定義されている型を通じてのみメソッドを呼び出すしようとして、調べられます。 たとえば、コードはオーバーランが発生するメモリ ロケーションを許可する方法でアクセスする、オブジェクトのフィールドを使用することはできません。 さらに、検証タイプ セーフ規則の違反につながる不適切な MSIL のためかどうか、MSIL が正しく生成されてを確認するコードを検査します。 検証処理のタイプ セーフなコードを明確に定義されたセットをタイプ セーフであるコードのみ渡します。 ただし、タイプ セーフなコードが検証、検証処理のいくつかの制限のため渡しません、一部の言語仕様により、実行されません検証可能なタイプ セーフ コードを生成します。 タイプ セーフなコードは、セキュリティ ポリシーで必要ですが、コードの検証を渡しません場合に、例外が、コードが実行されるとスローされます。

参照

概念

マネージ実行プロセス