ランタイムがアセンブリを検索する方法

.NET Framework アプリケーションを正しく配置するには、アプリケーションを構成するアセンブリを共通言語ランタイムがどのように検索し、バインドするかを理解している必要があります。 既定では、ランタイムはアプリケーションを構成するアセンブリの正しいバージョンをバインドしようとします。 この既定の動作は、構成ファイルの設定によってオーバライドできます。

共通言語ランタイムは、アプリケーションを検索し、アセンブリの参照を解決しようとするときにいくつかの手順を実行します。 それぞれの手順については、後続のセクションで説明します。 ランタイムがアセンブリを検索する方法の説明では、"プローブ" という用語が頻繁に使用されます。プローブとは、アセンブリの名前およびカルチャに基づいてアセンブリを特定するための一連のヒューリスティックです。

メモメモ

Windows Software Development Kit (SDK) に含まれているアセンブリ バインディング ログ ビューアー (Fuslogvw.exe) を使用すると、ログ ファイル内のバインディング情報を表示できます。

バインドの開始

アセンブリを検索し、バインドするプロセスは、ランタイムが別のアセンブリへの参照を解決しようとしたときに開始します。 この参照は、静的参照または動的参照のいずれかです。 コンパイラは、ビルド時に静的参照をアセンブリ マニフェストのメタデータに記録します。 動的参照は、System.Reflection.Assembly.Load など、各種のメソッド呼び出しの結果として実行時に生成されます。

お勧めするアセンブリの参照方法は、アセンブリ名、バージョン、カルチャ、および公開キー トークン (存在する場合) を含む完全参照を使用することです。 ランタイムはこれらの情報を使用して、このセクションで後述する手順に従ってアセンブリを検索します。 静的アセンブリまたは動的アセンブリのいずれかへの参照に関係なく、ランタイムは同じ解決プロセスを使用します。

アセンブリ名だけを指定するなど、アセンブリについての情報の一部だけを指定した呼び出しメソッドを提供することで、アセンブリを動的に参照することもできます。 その場合は、アセンブリの検索はアプリケーション ディレクトリ内だけで行われ、その他のチェックは行われません。 System.Reflection.Assembly.Load または System.AppDomain.Load などのアセンブリの読み込み用のさまざまなメソッドを使用した部分参照を作成します。

最後に、System.Reflection.Assembly.Load などのメソッドを使用して動的参照を行い、情報の一部だけを提供できます。その後でアプリケーション構成ファイル内の <qualifyAssembly> 要素を使用してその参照を限定できます。 この要素を使用すると、完全な参照情報 (名前、バージョン、カルチャ、および適用可能な場合は公開キー トークン) をコード内ではなく、アプリケーション構成ファイル内に提供できます。 アプリケーション ディレクトリ外部のアセンブリへの参照を完全に限定する必要がある場合、またはグローバル アセンブリ キャッシュ内のアセンブリを参照するが、完全参照をコード内ではなく構成ファイル内に指定する方が便利な場合は、この手法を使用します。

メモメモ

このタイプの部分参照は、複数のアプリケーションで共有されるアセンブリに対しては使用しないでください。構成設定はアセンブリ別ではなくアプリケーション別に適用されるため、このタイプの部分参照を使用する共有アセンブリについては、その共有アセンブリを使用するアプリケーションごとに、そのアプリケーションの構成ファイル内に限定情報を含める必要があります。

ランタイムは、次の手順でアセンブリ参照を解決します。

  1. 適用可能な構成ファイル (アプリケーション構成ファイル、発行者ポリシー ファイル、マシン構成ファイルなど) をチェックして、正しいアセンブリ バージョンを決定します。 構成ファイルがリモート コンピューターに配置されている場合、ランタイムは最初にアプリケーション構成ファイルを検索し、ダウンロードする必要があります。

  2. 以前にアセンブリ名がバインドされているかどうかをチェックし、バインドされている場合は、前に読み込んだアセンブリを使用します。 前にアセンブリの読み込み要求が失敗している場合は、アセンブリの読み込みを試みることなく要求が直ちにエラーとなります。

    メモメモ

    アセンブリ バインディング エラーのキャッシュは、.NET Framework Version 2.0 で新たに追加されました。

  3. グローバル アセンブリ キャッシュをチェックします。 グローバル アセンブリ キャッシュ内でアセンブリが見つかった場合は、そのアセンブリを使用します。

  4. 次の手順で、アセンブリのプローブを行います。

    1. 構成と発行者ポリシーが元の参照に影響しない場合およびバインド要求が Assembly.LoadFrom メソッドで作成されている場合、ランタイムは位置ヒントをチェックします。

    2. 構成ファイル内でコードベースが見つかった場合、ランタイムはその場所だけをチェックします。 このプローブが失敗した場合、ランタイムはバインド要求が失敗したと判断し、それ以上のプローブは行いません。

    3. 手順 4: コードベースまたはプローブによるアセンブリの検索」で説明するヒューリスティックを使用してアセンブリをプローブします。 プローブしてもアセンブリが見つからなかった場合、ランタイムは Windows Installer に対してアセンブリを提供するように要求します。 これは、オンデマンド インストール機能として実行されます。

      メモメモ

      厳密な名前を持たないアセンブリについては、ランタイムはバージョン チェックを行いません。また、厳密な名前を持たないアセンブリについては、グローバル アセンブリ キャッシュ内のチェックも行いません。

参照

概念

手順 1: 構成ファイルのチェック

手順 2: 前に参照したアセンブリの検索

手順 3: グローバル アセンブリ キャッシュのチェック

手順 4 : コードベースまたはプローブによるアセンブリの検索

部分アセンブリ参照

.NET Framework およびアプリケーションの配置