手順 4 : コードベースまたはプローブによるアセンブリの検索
更新 : 2007 年 11 月
共通言語ランタイムは、呼び出し元アセンブリの参照および構成ファイル内の情報を使用して正しいアセンブリ バージョンを決定した後、およびグローバル アセンブリ キャッシュ内をチェック (厳密な名前が付いたアセンブリの場合だけ) した後で、アセンブリの検索を試みます。アセンブリを検索するプロセスは、次のとおりです。
アプリケーション構成ファイル内で <codeBase> 要素が見つかった場合、ランタイムはこの要素に指定されている場所を調べます。一致するアセンブリが見つかった場合は、そのアセンブリが使用され、プローブは行われません。指定されている場所でアセンブリが見つからなかった場合、バインド要求は失敗します。
次に、ランタイムは、後でこのセクションで指定する規則に従って、参照先アセンブリをプローブします。
メモ : |
---|
アセンブリがディレクトリ内に複数バージョンあり、特定バージョンのアセンブリを参照する場合は、<probing> 要素の privatePath 属性ではなく、<codeBase> 要素を使用する必要があります。<probing> 要素を使用する場合、ランタイムは、参照されている単純なアセンブリ名に一致するアセンブリを最初に見つけた時点で、そのアセンブリが適切かどうかに関係なく、プローブを停止します。アセンブリが適切である場合は、そのアセンブリが使用されます。アセンブリが適切ではない場合は、プローブは停止し、バインディングは失敗します。 |
コードベースによるアセンブリの検索
コードベース情報は、構成ファイル内の <codeBase> 要素を使用して提供できます。コードベースは、ランタイムが参照先アセンブリのプローブを試みる前に、常にチェックされます。最終的なバージョン リダイレクトを含む発行者ポリシー ファイルに、<codeBase> 要素も含まれている場合は、その <codeBase> 要素が使用されます。たとえば、アプリケーション構成ファイルに <codeBase> 要素 が指定されていて、アプリケーション情報をオーバーライドする発行者ポリシー ファイルにも <codeBase> 要素が指定されている場合は、発行者ポリシー ファイル内の <codeBase> 要素が使用されます。
<codeBase> 要素で指定された場所に一致するアセンブリが見つからなかった場合、バインド要求は失敗し、その後の手順は実行されません。ランタイムは、アセンブリが呼び出し元アセンブリの検索条件と一致すると判断したときにそのアセンブリを使用します。指定された <codeBase> 要素で示されたファイルを読み込んだとき、ランタイムは、名前、バージョン、カルチャ、および公開キーが呼び出し元アセンブリの参照と一致するかどうかを確認します。
メモ : |
---|
アプリケーションのルート ディレクトリ外部の参照先アセンブリには厳密な名前を使用する必要があり、参照先アセンブリを、グローバル アセンブリ キャッシュにインストールするか、または <codeBase> 要素を使用して指定する必要があります。 |
プローブによるアセンブリの検索
アプリケーション構成ファイルに <codeBase> 要素がない場合、ランタイムは次の 4 つの条件を使用してアセンブリをプローブします。
アプリケーション ベース (アプリケーションが実行されるルート位置)。
カルチャ (参照先アセンブリのカルチャ属性)。
名前 (参照先アセンブリの名前)。
<probing> 要素の privatePath 属性。ルート位置の下にあるサブディレクトリのユーザー定義の一覧です。この場所は、アプリケーション ドメインの AppendPrivatePath プロパティを使用して、アプリケーション構成ファイルとマネージ コード内に指定できます。マネージ コード内に指定した場合は、マネージ コード privatePath が先にプローブされ、その後でアプリケーション構成ファイルに指定したパスがプローブされます。
アプリケーション ベース ディレクトリとカルチャ ディレクトリのプローブ
ランタイムは、常に、アプリケーションのベース (URL またはコンピュータ上のアプリケーションのルート ディレクトリのいずれか) からプローブを開始します。アプリケーション ベースで参照先アセンブリが見つからず、カルチャ情報が提供されていない場合、ランタイムはそのアセンブリ名を持つすべてのサブディレクトリ内を検索します。プローブされるディレクトリは、次のとおりです。
[application base] / [assembly name].dll
[application base] / [assembly name] / [assembly name].dll
参照先アセンブリについてのカルチャ情報が指定されている場合は、次のディレクトリだけがプローブされます。
[application base] / [culture] / [assembly name].dll
[application base] / [culture] / [assembly name] / [assembly name].dll
privatePath 属性を使用したプローブ
カルチャ サブディレクトリや参照先アセンブリの名前と同じ名前が付いたサブディレクトリの他に、ランタイムは、<probing> 要素の privatePath 属性で指定されたディレクトリもプローブします。privatePath 属性で指定するディレクトリは、アプリケーションのルート ディレクトリのサブディレクトリである必要があります。プローブされるディレクトリは、参照先アセンブリ要求にカルチャ情報が含まれているかどうかによって異なります。
ランタイムは、参照されている単純なアセンブリ名に一致するアセンブリを最初に見つけた時点で、そのアセンブリが適切かどうかに関係なく、プローブを停止します。アセンブリが適切である場合は、そのアセンブリが使用されます。アセンブリが適切ではない場合は、プローブは停止し、バインディングは失敗します。
カルチャが含まれている場合は、次のディレクトリがプローブされます。
[application base] / [binpath] / [culture] / [assembly name].dll
[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll
カルチャ情報が含まれていない場合は、次のディレクトリがプローブされます。
[application base] / [binpath] / [assembly name].dll
[application base] / [binpath] / [assembly name] / [assembly name].dll
プローブの例
次の情報が指定されています。
参照先アセンブリの名前 : myAssembly
アプリケーションのルート ディレクトリ : http://www.code.microsoft.com
構成ファイル内の <probing> 要素 : bin
カルチャ : de
ランタイムは、次の URL をプローブします。
http://www.code.microsoft.com/de/myAssembly.dll
http://www.code.microsoft.com/de/myAssembly/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll
同じ名前の複数のアセンブリ
同じ名前を持つ複数のアセンブリを設定する方法を次の例に示します。
<dependentAssembly>
<assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
<codeBase version="1.0.0.0" href="v1/Server.dll"/>
<codeBase version="2.0.0.0" href="v2/Server.dll"/>
</dependentAssembly>
プローブされるその他の場所
現在のバインディング コンテキストを使用して、アセンブリの場所を特定することもできます。この方法が最もよく使用されるのは、Assembly.LoadFrom メソッドが使用されている場合と、COM 相互運用のシナリオの場合です。アセンブリが LoadFrom メソッドを使用して別のアセンブリを参照している場合は、呼び出し元アセンブリの場所が、参照先アセンブリを検索する場所についてのヒントと見なされます。一致するアセンブリが見つかった場合は、そのアセンブリが読み込まれます。一致するアセンブリが見つからない場合は、ランタイムは、その検索セマンティクスを続行した後、Windows Installer に問い合わせて、アセンブリを提供するように求めます。バインド要求と一致するアセンブリが提供されない場合は、例外がスローされます。この例外は、型を参照していた場合はマネージ コード内の TypeLoadException であり、読み込もうとするアセンブリが見つからなかった場合は、FileNotFoundException です。
たとえば、Assembly1 が Assembly2 を参照し、Assembly1 が http://www.code.microsoft.com/utils からダウンロードされていた場合、この場所が、Assembly2.dll を検索する場所のヒントと見なされます。次に、ランタイムは http://www.code.microsoft.com/utils/Assembly2.dll と http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll のアセンブリをプローブします。どちらの場所でも Assembly2 が見つからなかった場合は、ランタイムは Windows Installer に問い合わせます。