Share via


高度なネイティブ イメージの生成のシナリオ

このトピックには、ネイティブ イメージを手動で作成する開発者や管理者に役立つ情報が含まれています。

アセンブリの依存関係

ネイティブ イメージ ジェネレーター (Ngen.exe) は、指定されたアセンブリおよびそのすべての依存関係のネイティブ イメージを生成します。 依存関係は、アセンブリ マニフェストを参照して決定されます。 依存関係を個別にインストールする必要がある唯一のシナリオは、アプリケーションがリフレクションを使用して (たとえば Assembly.Load メソッドを呼び出すことで) 依存関係を読み込み、その依存関係がネイティブ イメージの自動生成の対象になっていない場合です。 「ネイティブ イメージの作成」を参照してください。

重要

ネイティブ イメージに Assembly.LoadFrom メソッドは使用しないでください。実行コンテキストの他のアセンブリは、このメソッドを使用して読み込まれるイメージを使用できません。

Ngen.exe は依存関係のカウントを保持します。 たとえば、MyAssembly.exe と YourAssembly.exe がネイティブ イメージ キャッシュにインストールされており、この両方とも OurDependency.dll を参照するとします。 MyAssembly.exe をアンインストールしても OurDependency.dll はアンインストールされません。 DLL が削除されるのは、YourAssembly.exe もアンインストールされた場合だけです。

アセンブリのネイティブ イメージをグローバル アセンブリ キャッシュに生成している場合は表示名を指定します。 「Assembly.FullName」を参照してください。

NGen のルート

Ngen.exe コマンドによって直接作成されたネイティブ イメージは、ルートと呼ばれます。 異なるアセンブリを対象とした Ngen.exe コマンドの結果としてネイティブ イメージが作成された場合、ルートにはなりません。

アプリケーション ドメイン間でのネイティブ イメージの共有

Ngen.exe が生成するネイティブ イメージは、アプリケーション ドメイン間で共有できます。 つまり、アプリケーション ドメイン間でアセンブリを共有する必要のあるアプリケーション シナリオでは Ngen.exe を使用できます。 ドメイン中立性は、次の手順で指定します。

  1. アプリケーションに LoaderOptimizationAttribute 属性を適用します。

  2. 新しいアプリケーション ドメインのセットアップ情報を作成するときは、AppDomainSetup.LoaderOptimization プロパティを設定します。

複数のアプリケーション ドメインに同じアセンブリを読み込むときは、必ずドメイン中立のコードを使用します。 共有ドメインに読み込んだ後に非共有アプリケーション ドメインに読み込んだネイティブ イメージは使用できません。

注意

ドメイン中立コードはアンロードできません。また、特に静的メンバーにアクセスする際にパフォーマンスがわずかに低下します。

ネイティブ イメージのデバッグとプロファイル

アセンブリのネイティブ イメージが生成された後でそのアセンブリを実行する場合、ランタイムは、常にこのネイティブ イメージを自動的に検索して使用しようとします。 使用シナリオによっては、複数のイメージを生成できます。

たとえば、デバッグまたはプロファイルの目的でアセンブリを実行する場合、ランタイムは、Ngen.exe の /Debug または /Profile の各オプションを指定して生成されたネイティブ イメージを検索します。 一致するネイティブ イメージが見つからない場合、ランタイムは標準の JIT コンパイルに戻ります。 ネイティブ イメージをデバッグする唯一の方法は、/Debug オプションを使用してネイティブ イメージを作成することです。

Ngen Uninstall コマンドもシナリオを認識するため、すべてのシナリオまたは指定したシナリオだけをアンインストールできます。

ハード バインディング

ハード バインディングによってスループットが向上し、ネイティブ イメージの作業セットのサイズが小さくなります。 ハード バインディングの短所は、アセンブリを読み込む際にアセンブリにハード バインディングされているすべてのイメージを読み込む必要があることです。 これによって、大きなアプリケーションの起動時間がかなり長くなります。

ハード バインディングは、アプリケーションのすべてのパフォーマンスが重要な意味を持つシナリオで読み込まれる依存関係に適しています。 ネイティブ イメージの使用のすべての局面において言えることですが、ハード バインディングによってアプリケーションのパフォーマンスが向上するかどうかを確認する唯一の方法は、パフォーマンスを慎重に測定することです。

DependencyAttribute 属性と DefaultDependencyAttribute 属性によって、ハード バインディング ヒントを Ngen.exe に提供できます。

注意

この 2 つの属性は、コマンドではなく Ngen.exe へのヒントです。これらの属性を使用してもハード バインディングは保証されません。属性の意味は、今後のリリースで変更される可能性があります。

Hh691759.collapse_all(ja-jp,VS.110).gif依存関係のバインディング ヒントの指定

アセンブリに DependencyAttribute を適用して、指定された依存関係が読み込まれるかどうかを示します LoadHint.Always は、ハード バインディングが適切であることを示します。LoadHint.Default は、依存関係の既定値を使用する必要があることを示します。LoadHint.Sometimes は、ハード バインディングが適切ではないことを示します。

2 つの依存関係があるアセンブリのための属性のコードを次に示します。 最初の依存関係 (Assembly1) はハード バインディングに適していますが、2 番目の依存関係 (Assembly2) は適していません。

Imports System.Runtime.CompilerServices
<Assembly:DependencyAttribute("Assembly1", LoadHint.Always)>
<Assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)>
using System.Runtime.CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)]
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]
using namespace System::Runtime::CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)];
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)];

アセンブリ名には、ファイル名拡張子は含めません。 表示名を使用できます。

Hh691759.collapse_all(ja-jp,VS.110).gifアセンブリの既定のバインディング ヒントの指定

既定のバインディング ヒントは、依存するアプリケーションが即座に頻繁に使用するアセンブリのみに指定します。 そのようなアセンブリには、LoadHint.Always と共に DefaultDependencyAttribute を適用して、ハード バインディングを使用することを指定します。

注意

LoadHint.Always 以外の値を使用してこの属性を適用しても、この属性をまったく適用しない場合と結果は同じため、このカテゴリに属さない .dll アセンブリに DefaultDependencyAttribute を適用する理由はありません。

Microsoft では、DefaultDependencyAttribute を使用して、mscorlib.dll などのごく一部の .NET Framework のアセンブリの既定値としてハード バインディングを指定します。

ネイティブ イメージのバインディングに関する考慮事項

Ngen.exe を使用してアセンブリのネイティブ イメージを作成する場合、出力は指定したコマンドライン オプションおよび使用するコンピューター上の設定に依存します。 影響のある設定は次のとおりです。

  • .NET Framework Version。

  • オペレーティング システムのバージョン (Windows 9x ファミリから Windows NT ファミリに変更した場合)。

  • アセンブリの正確な ID (ID は再コンパイル時に変更されます)。

  • アセンブリが参照するすべてのアセンブリの正確な ID (ID は再コンパイル時に変更されます)。

  • セキュリティ関連の要因。

Ngen.exe は、ネイティブ イメージを生成するときに上記の情報を記録します。 アセンブリが実行されると、ランタイムは、コンピューターの現在の環境と一致するオプションおよび設定を指定して生成されたネイティブ イメージを検索します。 一致するネイティブ イメージが見つからない場合、ランタイムはアセンブリを JIT コンパイルに戻します。 コンピューターの設定および環境が次のように変更されると、ネイティブ イメージは無効になります。

  • .NET Framework Version。

    更新プログラムを .NET Framework に適用すると、Ngen.exe を使用して作成したすべてのネイティブ イメージは、無効になります。 したがって、.NET Framework の更新では、常に Ngen Update コマンドが実行されてすべてのネイティブ イメージが再生成されます。 .NET Framework は、インストールする .NET Framework ライブラリの新しいネイティブ イメージを自動的に作成します。

  • オペレーティング システムのバージョン (Windows 9x ファミリから Windows NT ファミリに変更した場合)。

    たとえば、コンピューターで稼動しているオペレーティング システムのバージョンが Windows 98 から Windows XP に変更されると、ネイティブ イメージ キャッシュに格納されたすべてのネイティブ イメージは無効になります。 ただし、オペレーティング システムを Windows 2000 から Windows XP に変更した場合は、イメージは無効になりません。

  • アセンブリの正確な ID。

    アセンブリを再コンパイルすると、アセンブリの対応するネイティブ イメージは無効になります。

  • アセンブリが参照するすべてのアセンブリの正確な ID。

    マネージ アセンブリを更新する場合、そのアセンブリに直接または間接に依存するすべてのネイティブ イメージが無効になるため、これらを再生成する必要があります。 これには、通常の参照と強くバインドされた依存関係も含まれます。 ソフトウェア更新プログラムを適用するときには、インストール プログラムで Ngen Update コマンドを実行して、依存するすべてのネイティブ イメージを再生成する必要があります。

  • セキュリティ関連の要因。

    アセンブリに事前に与えられていたアクセス許可を制限するマシン セキュリティ ポリシーを変更すると、そのアセンブリのコンパイル済みのネイティブ イメージが無効になることがあります。

    共通言語ランタイムがコード アクセス セキュリティを管理する方法とアクセス許可を使用する方法の詳細については、「Code Access Security」を参照してください。

アプリケーションでネイティブ イメージが使用されているかどうかを確認するには、Fuslogvw.exe (アセンブリ バインディング ログ ビューアー) を使用します。 バインディング ログ ビューアーのウィンドウの [ログのカテゴリ] ボックスで、[ネイティブ イメージ] をクリックします。 Fuslogvw.exe は、ネイティブ イメージが拒否された理由に関する情報を提供します。

ネイティブ イメージと JIT コンパイル

生成できないメソッドがアセンブリ内にある場合、Ngen.exe が生成するネイティブ イメージにそのメソッドは含まれません。 ランタイムは、このアセンブリの実行中に JIT コンパイルに戻し、ネイティブ イメージから除外されたこれらのメソッドを処理します。 jitCompilationStart マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) を使用して、JIT コンパイラが関数のコンパイルを開始するタイミングを判断できます。

参照

関連項目

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

概念

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

その他の技術情報

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