アセンブリ バージョンのリダイレクトRedirecting Assembly Versions

コンパイル時のバインド参照のリダイレクト先として、.NET Framework アセンブリ、サードパーティ製のアセンブリ、または独自のアプリのアセンブリを指定できます。You can redirect compile-time binding references to .NET Framework assemblies, third-party assemblies, or your own app's assemblies. アプリで別のバージョンのアセンブリを使用するようにリダイレクトするには、発行者ポリシーを使用する、アプリ構成ファイルを使用する、コンピューター構成ファイルを使用するなど、さまざまな方法があります。You can redirect your app to use a different version of an assembly in a number of ways: through publisher policy, through an app configuration file; or through the machine configuration file. ここでは、.NET Framework でのアセンブリ バインドの動作の仕組みと、構成方法について説明します。This article discusses how assembly binding works in the .NET Framework and how it can be configured.

アセンブリの統一と既定のバインドAssembly unification and default binding

.NET Framework アセンブリへのバインドは、 アセンブリの統一というプロセスによってリダイレクトされる場合があります。Bindings to .NET Framework assemblies are sometimes redirected through a process called assembly unification. .NET Framework は、1 つのバージョンの共通言語ランタイムと、型ライブラリを構成する 24 個前後の .NET Framework アセンブリで構成されています。The .NET Framework consists of a version of the common language runtime and about two dozen .NET Framework assemblies that make up the type library. これらの .NET Framework アセンブリは、ランタイムによって単一のユニットとして扱われます。These .NET Framework assemblies are treated by the runtime as a single unit. 既定では、アプリを起動するとき、ランタイムによって実行されるコード内の型のすべての参照が、プロセスに読み込まれたランタイムと同じバージョン番号を持つ .NET Framework アセンブリにリダイレクトされます。By default, when an app is launched, all references to types in code run by the runtime are directed to .NET Framework assemblies that have the same version number as the runtime that is loaded in a process. このモデルで発生するリダイレクトは、ランタイムの既定の動作となります。The redirections that occur with this model are the default behavior for the runtime.

たとえば、アプリが System.XML 名前空間の型を参照し、.NET Framework 4.5 を使用してビルドされた場合、ランタイムバージョン4.5 に付属している System.XML アセンブリへの静的参照が含まれています。For example, if your app references types in the System.XML namespace and was built by using the .NET Framework 4.5, it contains static references to the System.XML assembly that ships with runtime version 4.5. ここで、.NET Framework 4 と共に出荷された System.XML アセンブリを指すようにバインド参照をリダイレクトする場合は、リダイレクト情報をアプリ構成ファイルに追加します。If you want to redirect the binding reference to point to the System.XML assembly that ship with the .NET Framework 4, you can put redirect information in the app configuration file. 構成ファイルで、統一された .NET Framework アセンブリに対するバインド リダイレクトを設定すると、このアセンブリの統一が取り消されます。A binding redirection in a configuration file for a unified .NET Framework assembly cancels the unification for that assembly.

また、使用できる複数のバージョンがある場合は、サードパーティ アセンブリのアセンブリ バインドを手動でリダイレクトすることもできます。In addition, you may want to manually redirect assembly binding for third-party assemblies if there are multiple versions available.

発行者ポリシーを使用したアセンブリ バージョンのリダイレクトRedirecting assembly versions by using publisher policy

アセンブリの販売元は、新しいアセンブリに発行者ポリシー ファイルを含めることにより、より新しいバージョンのアセンブリにアプリをリダイレクトできます。Vendors of assemblies can direct apps to a newer version of an assembly by including a publisher policy file with the new assembly. 発行者ポリシー ファイルは、グローバル アセンブリ キャッシュに配置され、アセンブリ リダイレクトの設定が格納されます。The publisher policy file, which is located in the global assembly cache, contains assembly redirection settings.

アセンブリの major.minor バージョンごとに、独自の発行者ポリシー ファイルが割り当てられます。Each major.minor version of an assembly has its own publisher policy file. たとえば、バージョン 2.0.2.222 から 2.0.3.000 へのリダイレクトと、バージョン 2.0.2.321 から 2.0.3.000 へのリダイレクトは、いずれもバージョン 2.0 に関連付けられているため、両方とも同じファイルに記述します。For example, redirections from version 2.0.2.222 to 2.0.3.000 and from version 2.0.2.321 to version 2.0.3.000 both go into the same file, because they are associated with version 2.0. ただし、バージョン 3.0.0.999 から 4.0.0.000 へのリダイレクトは、バージョン 3.0.999 のファイルに記述します。However, a redirection from version 3.0.0.999 to version 4.0.0.000 goes into the file for version 3.0.999. .NET Framework のメジャー バージョンごとに、独自の発行者ポリシー ファイルが割り当てられます。Each major version of the .NET Framework has its own publisher policy file.

アセンブリの発行者ポリシー ファイルが存在する場合、ランタイムは、アセンブリのマニフェストとアプリ構成ファイルをチェックした後で、発行者ポリシー ファイルをチェックします。If a publisher policy file exists for an assembly, the runtime checks this file after checking the assembly's manifest and app configuration file. 販売元は、新しいアセンブリがリダイレクト元のアセンブリとの下位互換性を維持している場合にだけ、発行者ポリシー ファイルを使用するようにします。Vendors should use publisher policy files only when the new assembly is backward compatible with the assembly being redirected.

発行者ポリシーの省略」で説明するように、アプリ構成ファイルで設定を指定することによって、アプリの発行者ポリシーを省略することができます。You can bypass publisher policy for your app by specifying settings in the app configuration file, as discussed in the Bypassing publisher policy section.

アプリ レベルでのアセンブリ バージョンのリダイレクトRedirecting assembly versions at the app level

アプリ構成ファイルを通じてアプリのバインド動作を変更するには、いくつかの手法があります。手動でのファイルの編集、自動バインド リダイレクトの利用、発行者ポリシーの省略によるバインド動作の指定を行うことができます。There are a few different techniques for changing the binding behavior for your app through the app configuration file: you can manually edit the file, you can rely on automatic binding redirection, or you can specify binding behavior by bypassing publisher policy.

手動でのアプリ構成ファイルの編集Manually editing the app config file

手動でアプリ構成ファイルを編集して、アセンブリの問題を解決できます。You can manually edit the app configuration file to resolve assembly issues. たとえば、販売元が、アプリで使用しているアセンブリの新しいバージョンをリリースしたが、下位互換性を保証していないために、発行者ポリシーを提供しない場合でも、次のように、アプリ構成ファイルにアセンブリ バインド情報を記述することによって、アプリで新しいバージョンのアセンブリを使用するように指示できます。For example, if a vendor might release a newer version of an assembly that your app uses without supplying a publisher policy, because they do not guarantee backward compatibility, you can direct your app to use the newer version of the assembly by putting assembly binding information in your app's configuration file as follows.

<dependentAssembly>
  <assemblyIdentity name="someAssembly"
    publicKeyToken="32ab4ba45e0a69a1"
    culture="en-us" />
  <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>

自動バインド リダイレクトの利用Relying on automatic binding redirection

.NET Framework 4.5.1 以降のバージョンを対象とするデスクトップアプリを Visual Studio で作成すると、アプリは自動バインドリダイレクトを使用します。When you create a desktop app in Visual Studio that targets the .NET Framework 4.5.1 or a later version, the app uses automatic binding redirection. これは、2 つのコンポーネントが同じ厳密な名前付きアセンブリの異なるバージョンを参照する場合、ランタイムは出力するアプリ構成ファイル (app.config) に新しいバージョンのアセンブリへのバインド リダイレクトを自動的に追加することを意味します。This means that if two components reference different versions of the same strong-named assembly, the runtime automatically adds a binding redirection to the newer version of the assembly in the output app configuration (app.config) file. このリダイレクトは、別の方法で発生する可能性があるアセンブリの統一をオーバーライドします。This redirection overrides the assembly unification that might otherwise take place. ソース app.config ファイルは変更されません。The source app.config file is not modified. たとえば、アプリがアウトオブバンド .NET Framework コンポーネントを直接参照する場合に、同じコンポーネントの旧バージョンを対象とするサードパーティのライブラリを使用しているとします。For example, let's say that your app directly references an out-of-band .NET Framework component but uses a third-party library that targets an older version of the same component. このアプリをコンパイルすると、出力されるアプリ構成ファイルは、新しいバージョンのコンポーネントへのバインド リダイレクトを含むように変更されます。When you compile the app, the output app configuration file is modified to contain a binding redirection to the newer version of the component. Web アプリを作成すると、バインドの競合に関するビルドの警告が表示され、ソース Web 構成ファイルに必要なバインド リダイレクトを追加するためオプションが示されます。If you create a web app, you receive a build warning regarding the binding conflict, which in turn, gives you the option to add the necessary binding redirect to the source web configuration file.

バインドリダイレクトをソース app.config ファイルに手動で追加すると、コンパイル時に、追加したバインドリダイレクトに基づいてアセンブリの統合が試行されます。If you manually add binding redirects to the source app.config file, at compile time, Visual Studio tries to unify the assemblies based on the binding redirects you added. たとえば、アセンブリの次のバインド リダイレクトを挿入するとします。For example, let's say you insert the following binding redirect for an assembly:

<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />

アプリ内の別のプロジェクトが同じアセンブリのバージョン 1.0.0.0 を参照する場合、自動バインド リダイレクトは、アプリがこのアセンブリのバージョン 2.0.0.0 で統一されるように、出力 app.config ファイルに次のエントリを追加します。If another project in your app references version 1.0.0.0 of the same assembly, automatic binding redirection adds the following entry to the output app.config file so that the app is unified on version 2.0.0.0 of this assembly:

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />

アプリが古いバージョンの .NET Framework を対象としている場合は、自動バインドリダイレクトを有効にすることができます。You can enable automatic binding redirection if your app targets older versions of the .NET Framework. この既定の動作をオーバーライドするには、任意のアセンブリの app.config ファイルにバインドリダイレクト情報を指定するか、バインドリダイレクト機能をオフにします。You can override this default behavior by providing binding redirection information in the app.config file for any assembly, or by turning off the binding redirection feature. この機能を有効または無効にする方法については、「 方法: 自動バインドリダイレクトを有効または無効にする」を参照してください。For information about how to turn this feature on or off, see How to: Enable and Disable Automatic Binding Redirection.

発行者ポリシーの省略Bypassing publisher policy

アプリの構成ファイルの発行者ポリシーを必要に応じてオーバーライドできます。You can override publisher policy in the app configuration file if necessary. たとえば、下位互換性を維持しているとされる新しいアセンブリ バージョンでも、アプリを破壊する可能性があります。For example, new versions of assemblies that claim to be backward compatible can still break an app. 発行者ポリシーを省略する場合は、 <publisherPolicy> アプリ構成ファイルの要素に要素を追加 <dependentAssembly> し、 apply 属性を noに設定します。これにより、前の [はい] 設定が上書きされます。If you want to bypass publisher policy, add a <publisherPolicy> element to the <dependentAssembly> element in the app configuration file, and set the apply attribute to no, which overrides any previous yes settings.

<publisherPolicy apply="no" />

発行者ポリシーを省略することにより、アプリの実行を続行できますが、必ず、問題点をアセンブリの販売元に報告してください。Bypass publisher policy to keep your app running for your users, but make sure you report the problem to the assembly vendor. アセンブリに発行者ポリシー ファイルを提供した場合、販売元はそのアセンブリが下位互換性を維持していること、およびクライアントが可能な限り新バージョンを使用できることを確認する必要があります。If an assembly has a publisher policy file, the vendor should make sure that the assembly is backward compatible and that clients can use the new version as much as possible.

コンピューター レベルでのアセンブリ バージョンのリダイレクトRedirecting assembly versions at the machine level

コンピューター管理者が 1 台のコンピューター上のすべてのアプリで特定のアセンブリ バージョンを使用する場合も、まれにあります。There might be rare cases when a machine administrator wants all apps on a computer to use a specific version of an assembly. たとえば、セキュリティ ホールを修復するために、すべてのアプリで特定のアセンブリ バージョンを使用する場合があります。For example, the administrator might want every app to use a particular assembly version, because that version fixes a security hole. コンピューターの構成ファイル内でアセンブリをリダイレクトした場合は、そのコンピューターで旧バージョンを使用しているすべてのアプリが新バージョンを使用するようになります。If an assembly is redirected in the machine's configuration file, all apps on that machine that use the old version will be directed to use the new version. コンピューター構成ファイルは、アプリ構成ファイルおよび発行者ポリシー ファイルよりもオーバーライドされます。The machine configuration file overrides the app configuration file and the publisher policy file. このファイルは、%runtime install path%\Config ディレクトリに含まれています。This file is located in the %runtime install path%\Config directory. 通常、.NET Framework は %drive%\Windows\Microsoft.NET\Framework ディレクトリにインストールされます。Typically, the .NET Framework is installed in the %drive%\Windows\Microsoft.NET\Framework directory.

構成ファイル内でのアセンブリ バインドの指定Specifying assembly binding in configuration files

アプリ構成ファイル、コンピューター構成ファイル、発行者ポリシー ファイルのいずれの場合も、同じ XML 形式を使用してバインド リダイレクトを指定できます。You use the same XML format to specify binding redirects whether it’s in the app configuration file, the machine configuration file, or the publisher policy file. あるアセンブリバージョンを別のバージョンにリダイレクトするには、要素を使用し <bindingRedirect> ます。To redirect one assembly version to another, use the <bindingRedirect> element. oldVersion 属性では、1 つのアセンブリ バージョンまたはバージョンの範囲を指定できます。The oldVersion attribute can specify a single assembly version or a range of versions. newVersion 属性では、1 つのバージョンを指定する必要があります。The newVersion attribute should specify a single version. たとえば、 <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> は、アセンブリ バージョン 1.1.0.0 ~ 1.2.0.0 の代わりにバージョン 2.0.0.0 を使用するようにランタイムに指示します。For example, <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> specifies that the runtime should use version 2.0.0.0 instead of the assembly versions between 1.1.0.0 and 1.2.0.0.

次のコード例は、さまざまなバインディング リダイレクトのシナリオを示しています。The following code example demonstrates a variety of binding redirect scenarios. この例では、 myAssemblyのバージョンの範囲に対するリダイレクトと、 mySecondAssemblyの単一のバインド リダイレクトを指定します。The example specifies a redirect for a range of versions for myAssembly, and a single binding redirect for mySecondAssembly. この例では、発行者ポリシー ファイルによって myThirdAssemblyのバインド リダイレクトがオーバーライドされないことも指定しています。The example also specifies that publisher policy file will not override the binding redirects for myThirdAssembly.

アセンブリをバインドするには、タグに xmlns 属性を指定して文字列 "urn: schema-microsoft-com: asm: v1" を指定する必要があり <assemblyBinding> ます。To bind an assembly, you must specify the string "urn:schemas-microsoft-com:asm.v1" with the xmlns attribute in the <assemblyBinding> tag.

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
        <!-- Assembly versions can be redirected in app,
          publisher policy, or machine configuration files. -->
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="mySecondAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
             <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
      <assemblyIdentity name="myThirdAssembly"
        publicKeyToken="32ab4ba45e0a69a1"
        culture="en-us" />
        <!-- Publisher policy can be set only in the app
          configuration file. -->
        <publisherPolicy apply="no" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

特定のバージョンへのアセンブリ バインドの制限Limiting assembly bindings to a specific version

アプリ構成ファイルの要素で appliesTo 属性を使用して <assemblyBinding> 、アセンブリバインディング参照を特定のバージョンの .NET Framework にリダイレクトできます。You can use the appliesTo attribute on the <assemblyBinding> element in an app configuration file to redirect assembly binding references to a specific version of the .NET Framework. このオプションの属性では、.NET Framework バージョン番号を使用して、適用するバージョンを指定します。This optional attribute uses a .NET Framework version number to indicate what version it applies to. appliesTo 属性が指定されていない場合、 <assemblyBinding> 要素は、すべてのバージョンの .NET Framework に適用されます。If no appliesTo attribute is specified, the <assemblyBinding> element applies to all versions of the .NET Framework.

たとえば、.NET Framework 3.5 アセンブリのアセンブリ バインドをリダイレクトするには、アプリ構成ファイルに次の XML コードを追加します。For example, to redirect assembly binding for a .NET Framework 3.5 assembly, you would include the following XML code in your app configuration file.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
    appliesTo="v3.5">
    <dependentAssembly>
      <!-- assembly information goes here -->
    </dependentAssembly>
  </assemblyBinding>
</runtime>

バージョンの順序でリダイレクト情報を入力する必要があります。You should enter redirection information in version order. たとえば、.NET Framework 3.5 アセンブリのアセンブリ バインド リダイレクト情報を入力し、次に .NET Framework 4.5 アセンブリの情報を入力します。For example, enter assembly binding redirection information for .NET Framework 3.5 assemblies followed by .NET Framework 4.5 assemblies. 最後に、 appliesTo 属性を使用せず、すべてのバージョンの .NET Framework に適用される .NET Framework アセンブリ リダイレクトのアセンブリ バインディング リダイレクト情報を入力します。Finally, enter assembly binding redirection information for any .NET Framework assembly redirection that does not use the appliesTo attribute and therefore applies to all versions of the .NET Framework. リダイレクトで競合が発生した場合は、構成ファイル内で最初に一致したリダイレクト ステートメントが使用されます。If there is a conflict in redirection, the first matching redirection statement in the configuration file is used.

たとえば、ある参照を .NET Framework 3.5 のアセンブリにリダイレクトし、別の参照を .NET Framework 4 のアセンブリにリダイレクトするには、次の擬似コードに示すパターンを使用します。For example, to redirect one reference to a .NET Framework 3.5 assembly and another reference to a .NET Framework 4 assembly, use the pattern shown in the following pseudocode.

<assemblyBinding xmlns="..." appliesTo="v3.5 ">
  <!--.NET Framework version 3.5 redirects here -->
</assemblyBinding>

<assemblyBinding xmlns="..." appliesTo="v4.0.30319">
  <!--.NET Framework version 4.0 redirects here -->
</assemblyBinding>

<assemblyBinding xmlns="...">
  <!-- redirects meant for all versions of the runtime -->
</assemblyBinding>

関連項目See also