次の方法で共有


ネイティブ イメージの作成

Windows 8 オペレーティング システム以降では、ネイティブ イメージを .NET Framework で自動的に作成できます。または、開発者や管理者が手動で作成することもできます。 ネイティブ イメージは、旧バージョンの Windows では手動でのみ作成できます。

ネイティブ イメージの自動生成

.NET Framework は、JIT コンパイラによる作業を追跡することで、ネイティブ イメージを自動的に生成します。 ネイティブ イメージの作成は、アプリケーションの実行中に行うには時間がかかりすぎるため、共通言語ランタイム (CLR) ではネイティブ イメージの生成タスクをキューに置き、Windows がメンテナンス モードをスケジュールしたときに実行されるようにします。 ネイティブ イメージの生成タスクが開始されると、追跡されたアセンブリのイメージがすべて作成されます。 ネイティブ イメージの作成後に起動したアプリケーションでは、JIT コンパイラを使用して Microsoft Intermediate Language (MSIL) をコンパイルする代わりに、ネイティブ イメージを自動的に読み込みます。

ネイティブ イメージの自動作成は、Windows 8 以降のすべての Windows クライアント SKU で利用できます。 アセンブリは、以下の基準を満たした場合にネイティブ イメージを自動作成できます。

  • アセンブリが .NET Framework 4.5 以降を対象としている。

  • アセンブリが、サポートされている以下の場所にインストールされている。

    • グローバル アセンブリ キャッシュ

    • Windows ストア のアプリ パッケージ。

.NET Framework ではこれらのネイティブ イメージの追跡、作成、および再生を自動的に管理します。 ネイティブ イメージの自動再生の詳細については、「ネイティブ イメージの解放」を参照してください。

注意

.NET Framework では使用量に基づいてネイティブ イメージを自動的に生成するため、アセンブリが初めて読み込まれるときには JIT コンパイラによってコンパイルされます。ネイティブ イメージは、Windows がメンテナンス モードをスケジュールしたときに後で生成されます。アプリケーションのネイティブ イメージを (テストの目的などで) より早く取得する場合は、アプリケーションを実行して終了し、Windows タスク スケジューラを使用して NGen タスクを実行します。

ネイティブ イメージの手動生成

ネイティブ イメージの自動生成がサポートされていないシナリオで作業している開発者は、Ngen.exe (ネイティブ イメージ ジェネレーター) を使用してネイティブ イメージのキャッシュを管理することで、ネイティブ イメージを利用できます。 NGen.exe は管理特権を持つ任意のプロセスで使用できますが、通常はアプリケーションのインストール中に起動されます。 インストール スクリプトでは、アセンブリをインストール場所にコピーしてから install コマンドを使用して NGen.exe を呼び出し、すべてのアプリケーションのアセンブリ用のネイティブ イメージを作成します。

セットアップ中に NGen.exe を呼び出すときは、コンパイルを遅らせると便利です。 コンパイルを遅らせるインストールでは、ネイティブ イメージのコンパイルの完了を待たずにユーザーがアプリケーションを実行できます。大きなアセンブリの場合、コンパイルは長時間を要します。 ユーザーの最初の実行では、ネイティブ イメージの代わりに JIT コンパイラが使用されます。 Windows がメンテナンス モードを次にスケジュールしたときに、要求されたネイティブ イメージが ネイティブ イメージ タスク によって生成されます。 アプリケーションが次に起動したときには、新たに生成されたイメージが使用されます。

注意

インストール後、イメージが次に自動生成されるまでの間の操作をスムーズにするために、マルチコア バックグラウンド JIT を使用して重要なコードの処理を加速できます。詳細については、ProfileOptimization クラスのトピックを参照してください。

ネイティブ イメージの手動作成例

ネイティブ イメージは、直ちに作成することも、ネイティブ イメージ タスク または ネイティブ イメージ サービス によって非同期的に作成することもできます。 多くのアプリケーションでは、ネイティブ イメージの作成を遅らせます。それによって、インストール プロセスが短縮され、ユーザーがアプリケーションをより早く使用できるようになるためです。 イメージの生成を遅らせることで、NGen.exe は複数の CPU コアを使用できるようになり、ネイティブ イメージの生成に必要な時間が短縮されます。また、さらに柔軟性のあるタイミングでネイティブ イメージを作成できます。

Hh691758.collapse_all(ja-jp,VS.110).gif例 1: NGen ワーカーの一時停止

ネイティブ イメージの非同期的作成における最初の手順は、ワーカー プロセスを一時停止することです。 これにより、アセンブリがディスクにコピーされる前にワーカー プロセスがアセンブリをコンパイルしなくなります。 次の Ngen.exe コマンドは、新しいイメージの作成をキューに置くために、サービスを一時停止します。

ngen queue pause

Hh691758.collapse_all(ja-jp,VS.110).gif例 2: 共有ネイティブ イメージの作成と依存ファイルの更新

共有アセンブリの所有者は、依存アセンブリのネイティブ イメージを最新の状態に保持しておく必要があります。 次の Ngen.exe のコマンド ラインは、共有コンポーネントのネイティブ イメージをインストールし、影響を受けるすべてのルートのアップデートを実行します。

ngen install "c:\Program Files\MyComponent\SharedAssembly.dll" /queue
ngen update /queue

最初の行では非同期コンパイル用にアセンブリを登録します。 この場合、コンパイル ターゲットは、アセンブリの完全修飾パスを使用して指定します。 /queue が指定されているため、NGen ワーカーはアセンブリを非同期的にコンパイルします。

SharedAssembly.dll はアプリケーション間で共有するように意図されているため、NGen.exe はこのアセンブリに依存するネイティブ イメージを検索し、更新する必要があります。 2 番目の行では、依存関係が変更されているアセンブリを非同期的に再コンパイルするように NGen ワーカーに指示します。

注意

共有アセンブリのインストーラーは、共有アセンブリが初めてインストールされる場合であっても、依存アセンブリが NGen.exe によって既にコンパイルされていることを常に前提とする必要があります。NGen.exe がアセンブリの依存関係を見つけられない場合は、依存関係が使用不可の場合にのみ使用できるネイティブ イメージが生成されます。共有アセンブリのネイティブ イメージが後でインストールされた場合は、依存アセンブリのネイティブ イメージを再生成する必要があります。そうしないと、共有アセンブリのネイティブ イメージは使用されません。

Hh691758.collapse_all(ja-jp,VS.110).gif例 3: アプリケーション用ネイティブ イメージの作成

次のコマンドは、現在のディレクトリにある ClientApp.exe のネイティブ イメージを生成し、ネイティブ イメージ キャッシュにインストールします。 アセンブリの構成ファイルが存在する場合、Ngen.exe はその構成ファイルを使用します。 さらに、ネイティブ イメージは、ClientApp.exe が参照するあらゆる .dll ファイルに対して生成されます。

ngen install ClientApp.exe

Ngen.exe によってインストールされるイメージは、ルートとも呼ばれます。 ルートは、アプリケーションまたは共有コンポーネントです。

指定したパスにある MyAssembly.exe のネイティブ イメージを生成するコマンドを次に示します。

ngen install c:\myfiles\MyAssembly.exe

アセンブリおよびその依存関係を検索する場合、Ngen.exe は共通言語ランタイムと同じプローブ ロジックを使用します。 既定では、ClientApp.exe が格納されているディレクトリがアプリケーションのベース ディレクトリとして使用され、すべてのアセンブリのプローブはこのディレクトリから始まります。 この動作は、/AppBase オプションを使用してオーバーライドできます。

アセンブリは、参照を伴わない依存関係を持つことができます。たとえば、Assembly.Load メソッドを使用して .dll ファイルを読み込む場合などです。 アプリケーション アセンブリの構成情報と /ExeConfig オプションを使用して、このような .dll ファイルのネイティブ イメージを作成できます。 MyApp.exe の構成情報を使用して MyLib.dll のネイティブ イメージを生成するコマンドを次に示します。

ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

この方法でインストールされたアセンブリは、アプリケーションと共に削除されません。

依存関係をアンインストールするには、それをインストールしたときと同じコマンド ライン オプションを使用します。 前の例から MyLib.dll をアンインストールするコマンドを次に示します。

ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

グローバル アセンブリ キャッシュにアセンブリのネイティブ イメージを作成するには、たとえば次のようにアセンブリの表示名を使用します。

ngen install "ClientApp, Version=1.0.0.0, Culture=neutral, 
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"

NGen.exe は、インストールする各シナリオに対して個別のイメージ セットを生成します。 たとえば、次のコマンドはネイティブ イメージの通常操作用の完全なセット、デバッグ用の完全なセット、およびプロファイル用の第 3 のセットをインストールします。

ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile

Hh691758.collapse_all(ja-jp,VS.110).gif例 4: NGen の非同期操作の優先度付けとスケジュール

多くのルートで構成されるアプリケーションでは、遅延されたアクションの優先順位の指定が必要になることがあります。 次のコマンドは、次の 3 つのルートのインストールをキューに置きます。 Assembly1 は、Windows がメンテナンス モードをスケジュールするのを待たずに最初にインストールされます。 Assembly2 もメンテナンス モードを待たずにインストールされますが、優先順位 1 のアクションがすべてインストールされた後にインストールされます。 Assembly3 は、Windows がメンテナンス モードをスケジュールしたときにインストールされます。

ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3

Hh691758.collapse_all(ja-jp,VS.110).gif例 5: 一時停止した NGen ワーカーの再開

すべての遅延操作がキューに置かれた後に、次のコマンドによってワーカーを再開します。

ngen queue continue

Hh691758.collapse_all(ja-jp,VS.110).gif例 6: スケジュールされた NGen 作業の即時実行の強制

すべての作業がスケジュールされ、NGen ワーカーが再開されると、アプリケーションでは操作の成功をユーザーに直ちに通知し、ネイティブ イメージの作成を NGen にスケジュールさせるか、ネイティブ イメージがいくつか作成されるまで待つことができます。 たとえば、一部のアプリケーションでは、ユーザーによるアプリケーションの初回の実行を、優先度の高いネイティブ イメージの作成に依存することがあります。 executeQueuedItems アクションを使用すると、キューに置かれているアクションを同時に強制的に実行できます。 オプションの優先順位を指定すると、このアクションは同等またはそれ以下の優先順位を持っているキュー内のアクションだけに適用されます。 次のコマンドは、キューに置かれている作業のうち、優先順位が 2 以上のものすべてをネイティブ イメージ タスクに完了させます。 優先順位 3 の作業は、Windows がメンテナンス モードをスケジュールしたときに完了します。

ngen executeQueuedItems 2

注意

もう 1 つの方法では、ネイティブ イメージを同期的に作成し、/queue オプションを使用せずに NGen Install コマンドを実行します。この方法は推奨できません。複数のプロセッサでの実行などの非同期の最適化を NGen.exe が利用できないためです。

参照

関連項目

Ngen.exe (ネイティブ イメージ ジェネレーター)

概念

ネイティブ イメージ

ネイティブ イメージの解放

ネイティブ イメージ タスク

ネイティブ イメージ サービス

その他の技術情報

ネイティブ イメージの生成