ランタイムがアセンブリを検索する方法How the Runtime Locates Assemblies

.NET Framework アプリケーションを正しく配置するには、アプリケーションを構成するアセンブリを共通言語ランタイムがどのように検索し、バインドするかを理解している必要があります。To successfully deploy your .NET Framework application, you must understand how the common language runtime locates and binds to the assemblies that make up your application. 既定では、ランタイムはアプリケーションを構成するアセンブリの正しいバージョンをバインドしようとします。By default, the runtime attempts to bind with the exact version of an assembly that the application was built with. この既定の動作は、構成ファイルの設定によってオーバーライドできます。This default behavior can be overridden by configuration file settings.

共通言語ランタイムは、アセンブリを検索し、アセンブリの参照を解決しようとするときにいくつかの手順を実行します。The common language runtime performs a number of steps when attempting to locate an assembly and resolve an assembly reference. それぞれの手順については、後続のセクションで説明します。Each step is explained in the following sections. ランタイムがアセンブリを検索する方法の説明では、「プローブ」という用語が頻繁に使用されます。プローブとは、アセンブリの名前およびカルチャに基づいてアセンブリを特定するための一連のヒューリスティックです。The term probing is often used when describing how the runtime locates assemblies; it refers to the set of heuristics used to locate the assembly based on its name and culture.

注意

に含まれているアセンブリ バインディング ログ ビューアー (Fuslogvw.exe) Windows Software Development Kit (SDK)Windows Software Development Kit (SDK)を使用すると、ログ ファイル内のバインディング情報を表示できます。You can view binding information in the log file using the Assembly Binding Log Viewer (Fuslogvw.exe), which is included in the Windows Software Development Kit (SDK)Windows Software Development Kit (SDK).

バインドの開始Initiating the Bind

アセンブリを検索し、バインドするプロセスは、ランタイムが別のアセンブリへの参照を解決しようとしたときに開始します。The process of locating and binding to an assembly begins when the runtime attempts to resolve a reference to another assembly. この参照は、静的参照または動的参照のいずれかです。This reference can be either static or dynamic. コンパイラは、ビルド時に静的参照をアセンブリ マニフェストのメタデータに記録します。The compiler records static references in the assembly manifest's metadata at build time. 動的参照は、 Assembly.Loadなど、各種のメソッド呼び出しの結果として実行時に生成されます。Dynamic references are constructed on the fly as a result of calling various methods, such as Assembly.Load.

お勧めするアセンブリの参照方法は、アセンブリ名、バージョン、カルチャ、および公開キー トークン (存在する場合) を含む完全参照を使用することです。The preferred way to reference an assembly is to use a full reference, including the assembly name, version, culture, and public key token (if one exists). ランタイムはこれらの情報を使用して、このセクションで後述する手順に従ってアセンブリを検索します。The runtime uses this information to locate the assembly, following the steps described later in this section. 静的アセンブリまたは動的アセンブリのいずれかへの参照に関係なく、ランタイムは同じ解決プロセスを使用します。The runtime uses the same resolution process regardless of whether the reference is for a static or dynamic assembly.

アセンブリ名だけを指定するなど、アセンブリについての情報の一部だけを指定した呼び出しメソッドを提供することで、アセンブリを動的に参照することもできます。You can also make a dynamic reference to an assembly by providing the calling method with only partial information about the assembly, such as specifying only the assembly name. その場合は、アセンブリの検索はアプリケーション ディレクトリ内だけでなされ、その他のチェックは実行されません。In this case, only the application directory is searched for the assembly, and no other checking occurs. Assembly.LoadAppDomain.Loadなどのアセンブリの読み込み用のさまざまなメソッドを使用した部分参照を作成します。You make a partial reference using any of the various methods for loading assemblies such as Assembly.Load or AppDomain.Load.

最後に、Assembly.Load などのメソッドを使用して動的参照を作成し、情報の一部だけを提供できます。その後で、アプリケーション構成ファイル内の <qualifyAssembly> 要素を使用してその参照を修飾します。Finally, you can make a dynamic reference using a method such as Assembly.Load and provide only partial information; you then qualify the reference using the <qualifyAssembly> element in the application configuration file. この要素を使用すると、完全な参照情報 (名前、バージョン、カルチャ、および適用可能な場合は公開キー トークン) をコード内ではなく、アプリケーション構成ファイル内に提供できます。This element allows you to provide the full reference information (name, version, culture and, if applicable, the public key token) in your application configuration file instead of in your code. アプリケーション ディレクトリ外部のアセンブリへの参照を完全に限定する必要がある場合、またはグローバル アセンブリ キャッシュ内のアセンブリを参照するが、完全参照をコード内ではなく構成ファイル内に指定する方が便利な場合は、この手法を使用します。You would use this technique if you wanted to fully qualify a reference to an assembly outside the application directory, or if you wanted to reference an assembly in the global assembly cache but you wanted the convenience of specifying the full reference in the configuration file instead of in your code.

注意

このタイプの部分参照は、複数のアプリケーションで共有されるアセンブリに対しては使用しないでください。This type of partial reference should not be used with assemblies that are shared among several applications. 構成設定はアセンブリ別ではなくアプリケーション別に適用されるため、このタイプの部分参照を使用する共有アセンブリについては、その共有アセンブリを使用するアプリケーションごとに、そのアプリケーションの構成ファイル内に限定情報を含める必要があります。Because configuration settings are applied per application and not per assembly, a shared assembly using this type of partial reference would require each application using the shared assembly to have the qualifying information in its configuration file.

ランタイムは、次の手順を使用することによってアセンブリ参照を解決します。The runtime uses the following steps to resolve an assembly reference:

  1. 適用可能な構成ファイル (アプリケーション構成ファイル、発行者ポリシー ファイル、マシン構成ファイルなど) をチェックして、正しいアセンブリ バージョンを決定します。 Determines the correct assembly version by examining applicable configuration files, including the application configuration file, publisher policy file, and machine configuration file. 構成ファイルがリモート コンピューターに配置されている場合、ランタイムは最初にアプリケーション構成ファイルを検索し、ダウンロードする必要があります。If the configuration file is located on a remote machine, the runtime must locate and download the application configuration file first.

  2. 以前にアセンブリ名がバインドされているかどうかをチェック し、バインドされている場合は、前に読み込んだアセンブリを使用します。Checks whether the assembly name has been bound to before and, if so, uses the previously loaded assembly. 前にアセンブリの読み込み要求が失敗している場合は、アセンブリの読み込みを試みることなく要求が直ちにエラーとなります。If a previous request to load the assembly failed, the request is failed immediately without attempting to load the assembly.

    注意

    アセンブリ バインディング エラーのキャッシュは、.NET Framework Version 2.0 で新たに追加されました。The caching of assembly binding failures is new in the .NET Framework version 2.0.

  3. グローバル アセンブリ キャッシュをチェックしますChecks the global assembly cache. そこにアセンブリが見つかった場合は、ランタイムでそのアセンブリが使用されます。If the assembly is found there, the runtime uses this assembly.

  4. 次の手順を使用することによって、アセンブリのプローブ を実行します。Probes for the assembly using the following steps:

    1. 構成と発行者ポリシーが元の参照に影響しない場合およびバインド要求が Assembly.LoadFrom メソッドを使用することによって作成されている場合、ランタイムは位置ヒントをチェックします。If configuration and publisher policy do not affect the original reference and if the bind request was created using the Assembly.LoadFrom method, the runtime checks for location hints.

    2. 構成ファイル内でコードベースが見つかった場合、ランタイムはその場所だけをチェックします。If a codebase is found in the configuration files, the runtime checks only this location. このプローブが失敗した場合、ランタイムはバインド要求が失敗したと判断し、それ以上のプローブは実行しません。If this probe fails, the runtime determines that the binding request failed and no other probing occurs.

    3. 手順 4: コードベースまたはプローブによるアセンブリの検索」で説明するヒューリスティックを使用してアセンブリをプローブします。Probes for the assembly using the heuristics described in the probing section. プローブしてもアセンブリが見つからなかった場合、ランタイムは Windows Installer に対してアセンブリを提供するように要求します。If the assembly is not found after probing, the runtime requests the Windows Installer to provide the assembly. これは、オンデマンド インストール機能として実行されます。This acts as an install-on-demand feature.

      注意

      厳密な名前を持たないアセンブリについては、ランタイムはバージョン チェックをしません。また、厳密な名前を持たないアセンブリについては、グローバル アセンブリ キャッシュ内のチェックも実行しません。There is no version checking for assemblies without strong names, nor does the runtime check in the global assembly cache for assemblies without strong names.

手順 1: 構成ファイルのチェックStep 1: Examining the Configuration Files

アセンブリ バインディング動作は、次の 3 つの XML ファイルに基づいて、さまざまなレベルで設定できます。Assembly binding behavior can be configured at different levels based on three XML files:

  • アプリケーション構成ファイルApplication configuration file.

  • 発行者ポリシー ファイルPublisher policy file.

  • マシン構成ファイルMachine configuration file.

これらのファイルには、特定のアセンブリについて、バインディング リダイレクト、コードの場所、バインディング モードなどの情報が同じ構文で記述されています。These files follow the same syntax and provide information such as binding redirects, the location of code, and binding modes for particular assemblies. バインディング プロセスをリダイレクトする各構成ファイルは <assemblyBinding> 要素を含めることができます。Each configuration file can contain an <assemblyBinding> element that redirects the binding process. <assemblyBinding> 要素の子要素には <dependentAssembly> 要素が含まれます。The child elements of the <assemblyBinding> element include the <dependentAssembly> element. <dependentAssembly> 要素の子は、<assemblyIdentity> 要素<bindingRedirect> 要素と、<codeBase> 要素が含まれます。The children of <dependentAssembly> element include the <assemblyIdentity> element, the <bindingRedirect> element, and the <codeBase> element.

注意

構成情報は、この 3 つの構成ファイル内に含まれていますが、すべての要素がすべての構成ファイルで有効なわけではありません。Configuration information can be found in the three configuration files; not all elements are valid in all configuration files. たとえば、バインディング モードやプライベート パス情報は、アプリケーション構成ファイルだけに含めることができます。For example, binding mode and private path information can only be in the application configuration file. 各ファイルに含まれる情報の完全な一覧については、「 構成ファイルを使用してアプリを構成する方法」を参照してください。For a complete list of the information that is contained in each file, see Configuring Apps by Using Configuration Files.

アプリケーション構成ファイルApplication Configuration File

最初に、共通言語ランタイムは、アプリケーション構成ファイル内に呼び出し元アセンブリのマニフェストに格納されているバージョン情報をオーバーライドする情報がないかどうかをチェックします。First, the common language runtime checks the application configuration file for information that overrides the version information stored in the calling assembly's manifest. アプリケーション構成ファイルはアプリケーションと共に配置できますが、アプリケーションの実行にとっては必須ではありません。The application configuration file can be deployed with an application, but is not required for application execution. 通常、このファイルはほとんど瞬時に取得できますが、Internet Explorer Web ベースのシナリオの場合のように、アプリケーション ベースがリモート コンピューターに存在するときは、構成ファイルをダウンロードする必要があります。Usually the retrieval of this file is almost instantaneous, but in situations where the application base is on a remote computer, such as in an Internet Explorer Web-based scenario, the configuration file must be downloaded.

クライアント実行可能ファイルの場合、アプリケーション構成ファイルは、アプリケーションの実行可能ファイルと同じディレクトリに配置され、実行可能ファイルと同じ名前に拡張子 .config を付けた基本名が割り当てられます。For client executables, the application configuration file resides in the same directory as the application's executable and has the same base name as the executable with a .config extension. たとえば、C:\Program Files\Myapp\Myapp.exe の構成ファイルは、C:\Program Files\Myapp\Myapp.exe.config です。ブラウザー ベースのシナリオでは、HTML ファイルは明示的に構成ファイルを指すために <link> 要素を使用する必要があります。For example, the configuration file for C:\Program Files\Myapp\Myapp.exe is C:\Program Files\Myapp\Myapp.exe.config. In a browser-based scenario, the HTML file must use the <link> element to explicitly point to the configuration file.

次のコードは、アプリケーション構成ファイルの簡単な例を示します。The following code provides a simple example of an application configuration file. この例では、 TextWriterTraceListenerListeners コレクションに追加し、デバッグ情報のファイルへの記録を有効にします。This example adds a TextWriterTraceListener to the Listeners collection to enable recording debug information to a file.

<configuration>  
   <system.diagnostics>  
      <trace useGlobalLock="false" autoflush="true" indentsize="0">  
         <listeners>  
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />  
         </listeners>  
      </trace>  
   </system.diagnostics>  
</configuration>  

発行者ポリシー ファイルPublisher Policy File

次に、ランタイムは、発行者ポリシー ファイルが存在する場合、このファイルをチェックします。Second, the runtime examines the publisher policy file, if one exists. 発行者ポリシー ファイルは、コンポーネントの発行者が共有コンポーネントへの修正または更新として配布します。Publisher policy files are distributed by a component publisher as a fix or update to a shared component. それらのファイルには、アセンブリ参照を新しいバージョンに伝える共有コンポーネントの発行者によって発行された互換情報が含まれています。These files contain compatibility information issued by the publisher of the shared component that directs an assembly reference to a new version. アプリケーション構成ファイルやマシン構成ファイルとは異なり、発行者ポリシー ファイルは、グローバル アセンブリ キャッシュにインストールする必要のあるその発行者ポリシー ファイルに固有のアセンブリに含める必要があります。Unlike application and machine configuration files, publisher policy files are contained in their own assembly that must be installed in the global assembly cache.

発行者ポリシーの構成ファイルの例を次に示します。The following is an example of a Publisher Policy configuration file:

<configuration>  
    <runtime>  
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
  
            <dependentAssembly>  
                <assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />   
                <bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>    
            </dependentAssembly>  
  
        </assemblyBinding>  
    </runtime>  
</configuration>  

アセンブリを作成するには、Al.exe (アセンブリ リンカー) ツールを使用し、次のようにコマンドを指定します。To create an assembly, you can use the Al.exe (Assembly Linker) tool with a command such as the following:

Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0  

compatkey.dat は厳密な名前のキー ファイルです。compatkey.dat is a strong-name key file. このコマンドにより、グローバル アセンブリ キャッシュに配置できる、厳密な名前のアセンブリが作成されます。This command creates a strong-named assembly you can place in the global assembly cache.

注意

発行者ポリシーは、同じ共有コンポーネントを使用するすべてのアプリケーションに適用されます。Publisher policy affects all applications that use a shared component.

発行者ポリシー構成ファイルは、アプリケーションからのバージョン情報 (つまり、アセンブリ マニフェストまたはアプリケーション構成ファイルからのバージョン情報) をオーバーライドします。The publisher policy configuration file overrides version information that comes from the application (that is, from the assembly manifest or from the application configuration file). アプリケーション構成ファイルに、アセンブリ マニフェストに指定されているバージョンをリダイレクトするように指示するステートメントがない場合、発行者ポリシー ファイルは、アセンブリ マニフェストに指定されているバージョンをオーバーライドします。If there is no statement in the application configuration file to redirect the version specified in the assembly manifest, the publisher policy file overrides the version specified in the assembly manifest. しかし、アプリケーション構成ファイルにリダイレクト ステートメントがある場合、発行者ポリシーは、マニフェストに指定されているバージョンではなく、アプリケーション構成ファイル内のバージョン情報をオーバーライドします。However, if there is a redirecting statement in the application configuration file, publisher policy overrides that version rather than the one specified in the manifest.

発行者ポリシー ファイルを使用するのは、共有コンポーネントが更新され、そのコンポーネントを使用するすべてのアプリケーションが共有コンポーネントの新しいバージョンを選択する必要がある場合です。A publisher policy file is used when a shared component is updated and the new version of the shared component should be picked up by all applications using that component. アプリケーション構成ファイルにセーフ モードが適用されていない限り、アプリケーション構成ファイル内の設定は、発行者ポリシー ファイル内の設定によってオーバーライドされます。The settings in the publisher policy file override settings in the application configuration file, unless the application configuration file enforces safe mode.

セーフ モードSafe Mode

通常、発行者ポリシー ファイルは、Service Pack またはプログラム更新の一部として明示的にインストールされます。Publisher policy files are usually explicitly installed as part of a service pack or program update. アップグレードされた共有コンポーネントに何か問題がある場合は、セーフ モードを使用して発行者ポリシー ファイル内のオーバーライドを無視できます。If there is any problem with the upgraded shared component, you can ignore the overrides in the publisher policy file using safe mode. セーフ モードは <publisherPolicy apply="yes|no"/> 要素によって決まります。この要素は、アプリケーション構成ファイルだけにあります。Safe mode is determined by the <publisherPolicy apply="yes|no"/> element, located only in the application configuration file. この要素は、発行者ポリシーの構成情報をバインディング プロセスから削除するかどうかを指定します。It specifies whether the publisher policy configuration information should be removed from the binding process.

セーフ モードは、アプリケーション全体に対して設定するか、または選択したアセンブリに対して設定できます。Safe mode can be set for the entire application or for selected assemblies. つまり、アプリケーションを構成するすべてのアセンブリのポリシーをオフに設定するか、または一部のアセンブリについてだけポリシーをオフにし、それ以外はオフにしないように設定できます。That is, you can turn off the policy for all assemblies that make up the application, or turn it on for some assemblies but not others. アプリケーションを構成するアセンブリに発行者ポリシーを選択的に適用するには、<publisherPolicy apply=no/> を設定し、<dependentAssembly> 要素を使用して適用対象のアセンブリを指定します。To selectively apply publisher policy to assemblies that make up an application, set <publisherPolicy apply=no/> and specify which assemblies you want to be affected using the <dependentAssembly> element. アプリケーションを構成するすべてのアセンブリに発行者ポリシーを適用するには、依存アセンブリの場合は、要素なしの <publisherPolicy apply=no/> を設定します。To apply publisher policy to all assemblies that make up the application, set <publisherPolicy apply=no/> with no dependent assembly elements. 構成の詳細については、「 構成ファイルを使用してアプリを構成する方法」を参照してください。For more about configuration, see Configuring Apps by using Configuration Files.

マシン構成ファイルMachine Configuration File

3 番目に、ランタイムはマシン構成ファイルをチェックします。Third, the runtime examines the machine configuration file. このファイルは、Machine.config という名前で、ローカル コンピューターの、ランタイムがインストールされているルート ディレクトリの Config サブディレクトリにあります。This file, called Machine.config, resides on the local computer in the Config subdirectory of the root directory where the runtime is installed. 管理者は、このマシン構成ファイルを使用して、そのコンピューターに固有のアセンブリ バインディング制限を指定できます。This file can be used by administrators to specify assembly binding restrictions that are local to that computer. マシン構成ファイル内の設定は、ほかのすべての構成設定に優先します。ただし、これは、他のすべての構成設定をこのマシン構成ファイルに配置する必要があるという意味ではありません。The settings in the machine configuration file take precedence over all other configuration settings; however, this does not mean that all configuration settings should be put in this file. 管理者ポリシー ファイルによって決定されるバージョンは最終的であり、オーバーライドすることはできません。The version determined by the administrator policy file is final, and cannot be overridden. Machine.config ファイル内に指定されたオーバーライドは、すべてのアプリケーションに作用します。Overrides specified in the Machine.config file affect all applications. 構成ファイルの詳細については、「 構成ファイルを使用してアプリを構成する方法」を参照してください。For more information about configuration files, see Configuring Apps by using Configuration Files.

手順 2: 前に参照したアセンブリの検索Step 2: Checking for Previously Referenced Assemblies

要求されたアセンブリが以前の呼び出しでも要求されていた場合、共通言語ランタイムは既に読み込まれているアセンブリを使用します。If the requested assembly has also been requested in previous calls, the common language runtime uses the assembly that is already loaded. アプリケーションを構成するアセンブリの名前付けの場合、これが影響を及ぼすこともあります。This can have ramifications when naming assemblies that make up an application. アセンブリの名前付けの詳細については、「 アセンブリ名」を参照してください。For more information about naming assemblies, see Assembly Names.

アセンブリに対する前の要求が失敗している場合、そのアセンブリに対する後続の要求は、アセンブリの読み込みを試みることなく即座に失敗します。If a previous request for the assembly failed, subsequent requests for the assembly are failed immediately without attempting to load the assembly. .NET Framework Version 2.0 からは、アセンブリ バインディング エラーがキャッシュされ、キャッシュされた情報を使用してアセンブリの読み込みを試みるかどうかが判断されるようになりました。Starting with the .NET Framework version 2.0, assembly binding failures are cached, and the cached information is used to determine whether to attempt to load the assembly.

注意

バインディング エラーをキャッシュしない .NET Framework Version 1.0 および 1.1 の動作に戻すには、構成ファイルに <disableCachingBindingFailures> 要素を追加します。To revert to the behavior of the .NET Framework versions 1.0 and 1.1, which did not cache binding failures, include the <disableCachingBindingFailures> Element in your configuration file.

手順 3: グローバル アセンブリ キャッシュのチェックStep 3: Checking the Global Assembly Cache

厳密な名前の付いたアセンブリの場合、バインディング プロセスは、続いてグローバル アセンブリ キャッシュ内を調べます。For strong-named assemblies, the binding process continues by looking in the global assembly cache. グローバル アセンブリ キャッシュには、コンピューター上の複数のアプリケーションで使用できるアセンブリが格納されています。The global assembly cache stores assemblies that can be used by several applications on a computer. グローバル アセンブリ キャッシュに配置するアセンブリには、すべて厳密な名前を付ける必要があります。All assemblies in the global assembly cache must have strong names.

手順 4 : コードベースまたはプローブによるアセンブリの検索Step 4: Locating the Assembly through Codebases or Probing

共通言語ランタイムは、呼び出し元アセンブリの参照および構成ファイル内の情報を使用して正しいアセンブリ バージョンを決定した後、およびグローバル アセンブリ キャッシュ内をチェック (厳密な名前が付いたアセンブリの場合だけ) した後で、アセンブリの検索を試みます。After the correct assembly version has been determined by using the information in the calling assembly's reference and in the configuration files, and after it has checked in the global assembly cache (only for strong-named assemblies), the common language runtime attempts to find the assembly. アセンブリを検索するプロセスは、次のとおりです。The process of locating an assembly involves the following steps:

  1. <codeBase> 要素は、アプリケーション構成ファイルに格納されている場合、ランタイムはこの要素に指定されている場所を調べます。If a <codeBase> element is found in the application configuration file, the runtime checks the specified location. 一致するアセンブリが見つかった場合は、そのアセンブリが使用され、プローブは実行されません。If a match is found, that assembly is used and no probing occurs. 指定されている場所でアセンブリが見つからなかった場合、バインド要求は失敗します。If the assembly is not found there, the binding request fails.

  2. 次に、ランタイムは、後でこのセクションで指定する規則に従って、参照先アセンブリをプローブします。The runtime then probes for the referenced assembly using the rules specified later in this section.

注意

アセンブリがディレクトリ内に複数バージョンあり、特定バージョンのアセンブリを参照する場合は、<probing> 要素の privatePath 属性ではなく <codeBase> 要素を使用する必要があります。If you have multiple versions of an assembly in a directory and you want to reference a particular version of that assembly, you must use the <codeBase> element instead of the privatePath attribute of the <probing> element. <probing> 要素を使用すると、ランタイムは、参照されている単純なアセンブリ名に一致するアセンブリを初めて検出した時点で、それが適切な一致かどうかに関係なくプローブを停止します。If you use the <probing> element, the runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. 適切な一致である場合は、そのアセンブリが使用されます。If it is a correct match, that assembly is used. 適切な一致でない場合、プローブは停止し、バインディングは失敗します。If it is not a correct match, probing stops and binding fails.

コードベースによるアセンブリの検索Locating the Assembly through Codebases

コードベース情報は、構成ファイルで <codeBase> 要素を使用して指定できます。Codebase information can be provided by using a <codeBase> element in a configuration file. コードベースは、ランタイムが参照先アセンブリのプローブを試みる前に、常にチェックされます。This codebase is always checked before the runtime attempts to probe for the referenced assembly. 最終バージョン リダイレクトを含む発行者ポリシー ファイルに <codeBase> 要素も含まれている場合、その <codeBase> 要素が使用されます。If a publisher policy file containing the final version redirect also contains a <codeBase> element, that <codeBase> element is the one that is used. たとえば、アプリケーション構成ファイルに <codeBase> 要素が指定されていて、アプリケーション情報をオーバーライドする発行者ポリシー ファイルにも <codeBase> 要素が指定されている場合、発行者ポリシー ファイルの <codeBase> 要素が使用されます。For example, if your application configuration file specifies a <codeBase> element, and a publisher policy file that is overriding the application information also specifies a <codeBase> element, the <codeBase> element in the publisher policy file is used.

一致が <codeBase> 要素で指定された場所に見つからなかった場合、バインド要求は失敗し、その後の手順は実行されません。If no match is found at the location specified by the <codeBase> element, the bind request fails and no further steps are taken. ランタイムは、アセンブリが呼び出し元アセンブリの検索条件と一致すると判断したときにそのアセンブリを使用します。If the runtime determines that an assembly matches the calling assembly's criteria, it uses that assembly. <codeBase> の特定の要素に指定されたファイルが読み込まれると、ランタイムは、名前、バージョン、カルチャ、および公開キーが呼び出し元アセンブリの参照と一致するかどうかをチェックします。When the file specified by the given <codeBase> element is loaded, the runtime checks to make sure that the name, version, culture, and public key match the calling assembly's reference.

注意

アプリケーションのルート ディレクトリの外部で参照されているアセンブリは、厳密な名前が付けられていなければならず、グローバル アセンブリ キャッシュにインストールするか、または <codeBase> 要素を使用して指定する必要があります。Referenced assemblies outside the application's root directory must have strong names and must either be installed in the global assembly cache or specified using the <codeBase> element.

プローブによるアセンブリの検索Locating the Assembly through Probing

アプリケーション構成ファイルに <codeBase> 要素がない場合、ランタイムは 4 個の条件を使用してアセンブリをプローブします。If there is no <codeBase> element in the application configuration file, the runtime probes for the assembly using four criteria:

  • アプリケーション ベース (アプリケーションが実行されるルート位置)。Application base, which is the root location where the application is being executed.

  • カルチャ (参照先アセンブリのカルチャ属性)。Culture, which is the culture attribute of the assembly being referenced.

  • 名前 (参照先アセンブリの名前)。Name, which is the name of the referenced assembly.

  • <probing> 要素の privatePath 属性 (ルート位置の下にあるサブディレクトリのユーザー定義の一覧)。The privatePath attribute of the <probing> element, which is the user-defined list of subdirectories under the root location. この場所は、アプリケーション ドメインの AppDomainSetup.PrivateBinPath プロパティを使用して、アプリケーション構成ファイルとマネージド コード内に指定できます。This location can be specified in the application configuration file and in managed code using the AppDomainSetup.PrivateBinPath property for an application domain. マネージド コード内に指定した場合は、マネージド コード privatePath が先にプローブされ、その後でアプリケーション構成ファイルに指定したパスがプローブされます。When specified in managed code, the managed code privatePath is probed first, followed by the path specified in the application configuration file.

アプリケーション ベース ディレクトリとカルチャ ディレクトリのプローブProbing the Application Base and Culture Directories

ランタイムは、常に、アプリケーションのベース (URL またはコンピューター上のアプリケーションのルート ディレクトリのいずれか) からプローブを開始します。The runtime always begins probing in the application's base, which can be either a URL or the application's root directory on a computer. アプリケーション ベースで参照先アセンブリが見つからず、カルチャ情報が提供されていない場合、ランタイムはそのアセンブリ名を持つすべてのサブディレクトリ内を検索します。If the referenced assembly is not found in the application base and no culture information is provided, the runtime searches any subdirectories with the assembly name. プローブされるディレクトリは、次のとおりです。The directories probed include:

[application base] / [assembly name].dll[application base] / [assembly name].dll

[application base] / [assembly name] / [assembly name].dll[application base] / [assembly name] / [assembly name].dll

参照先アセンブリについてのカルチャ情報が指定されている場合は、次のディレクトリだけがプローブされます。If culture information is specified for the referenced assembly, only the following directories are probed:

[application base] / [culture] / [assembly name].dll[application base] / [culture] / [assembly name].dll

[application base] / [culture] / [assembly name] / [assembly name].dll[application base] / [culture] / [assembly name] / [assembly name].dll

privatePath 属性を使用したプローブProbing with the privatePath Attribute

参照アセンブリの名前をカルチャ サブディレクトリとサブディレクトリの他に、ランタイムは、<probing> 要素の privatePath 属性を使用して指定されたディレクトリをプローブします。In addition to the culture subdirectories and the subdirectories named for the referenced assembly, the runtime also probes directories specified using the privatePath attribute of the <probing> element. privatePath 属性を使用して指定するディレクトリは、アプリケーションのルート ディレクトリのサブディレクトリである必要があります。The directories specified using the privatePath attribute must be subdirectories of the application's root directory. プローブされるディレクトリは、参照先アセンブリ要求にカルチャ情報が含まれているかどうかによって異なります。The directories probed vary depending on whether culture information is included in the referenced assembly request.

ランタイムは、参照されている単純なアセンブリ名に一致するアセンブリを最初に見つけた時点で、それが適切な一致かどうかに関係なく、プローブを停止します。The runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. 適切な一致である場合は、そのアセンブリが使用されます。If it is a correct match, that assembly is used. 適切な一致でない場合、プローブは停止し、バインディングは失敗します。If it is not a correct match, probing stops and binding fails.

カルチャが含まれている場合は、次のディレクトリがプローブされます。If culture is included, the following directories are probed:

[application base] / [binpath] / [culture] / [assembly name].dll[application base] / [binpath] / [culture] / [assembly name].dll

[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll

カルチャ情報が含まれていない場合は、次のディレクトリがプローブされます。If culture information is not included, the following directories are probed:

[application base] / [binpath] / [assembly name].dll[application base] / [binpath] / [assembly name].dll

[application base] / [binpath] / [assembly name] / [assembly name].dll[application base] / [binpath] / [assembly name] / [assembly name].dll

プローブの例Probing Examples

次の情報が指定されています。Given the following information:

  • 参照先アセンブリの名前: myAssemblyReferenced assembly name: myAssembly

  • アプリケーション ルート ディレクトリ: http://www.code.microsoft.comApplication root directory: http://www.code.microsoft.com

  • 構成ファイルの <probing> 要素による指定: bin<probing> element in configuration file specifies: bin

  • カルチャ: deCulture: de

ランタイムは、次の URL をプローブします。The runtime probes the following URLs:

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

同じ名前の複数のアセンブリMultiple Assemblies with the Same Name

同じ名前を持つ複数のアセンブリを設定する方法を次の例に示します。The following example shows how to configure multiple assemblies with the same name.

<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>  

プローブされるその他の場所Other Locations Probed

現在のバインディング コンテキストを使用して、アセンブリの場所を特定することもできます。Assembly location can also be determined using the current binding context. この方法が最もよく使用されるのは、 Assembly.LoadFrom メソッドが使用されている場合と、COM 相互運用のシナリオの場合です。This most often occurs when the Assembly.LoadFrom method is used and in COM interop scenarios. アセンブリが LoadFrom メソッドを使用して別のアセンブリを参照している場合は、呼び出し元アセンブリの場所が、参照先アセンブリを検索する場所についてのヒントと見なされます。If an assembly uses the LoadFrom method to reference another assembly, the calling assembly's location is considered to be a hint about where to find the referenced assembly. 一致するものが見つかった場合は、そのアセンブリが読み込まれます。If a match is found, that assembly is loaded. 一致するものが見つからない場合は、ランタイムは、その検索セマンティクスを続行した後、Windows Installer に問い合わせて、アセンブリを提供するように求めます。If no match is found, the runtime continues with its search semantics and then queries the Windows Installer to provide the assembly. バインド要求と一致するアセンブリが提供されない場合は、例外がスローされます。If no assembly is provided that matches the binding request, an exception is thrown. この例外は、型を参照していた場合はマネージド コード内の TypeLoadException であり、読み込もうとするアセンブリが見つからなかった場合は、 FileNotFoundException です。This exception is a TypeLoadException in managed code if a type was referenced, or a FileNotFoundException if an assembly being loaded was not found.

たとえば、Assembly1 が Assembly2 を参照し、Assembly1 が http://www.code.microsoft.com/utils からダウンロードされていた場合、この場所が、Assembly2.dll を検索する場所についてのヒントと見なされます。For example, if Assembly1 references Assembly2 and Assembly1 was downloaded from http://www.code.microsoft.com/utils, that location is considered to be a hint about where to find Assembly2.dll. 次に、ランタイムは http://www.code.microsoft.com/utils/Assembly2.dllhttp://www.code.microsoft.com/utils/Assembly2/Assembly2.dll のアセンブリをプローブします。The runtime then probes for the assembly in http://www.code.microsoft.com/utils/Assembly2.dll and http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. どちらの場所でも Assembly2 が見つからなかった場合は、ランタイムは Windows Installer に問い合わせます。If Assembly2 is not found at either of those locations, the runtime queries the Windows Installer.

参照See Also