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

コンパイル時のバインド参照のリダイレクト先として、.NET Framework アセンブリ、サードパーティ製のアセンブリ、または独自のアプリのアセンブリを指定できます。 アプリで別のバージョンのアセンブリを使用するようにリダイレクトするには、発行者ポリシーを使用する、アプリ構成ファイルを使用する、コンピューター構成ファイルを使用するなど、さまざまな方法があります。 ここでは、.NET Framework でのアセンブリ バインドの動作の仕組みと、構成方法について説明します。

ヒント

この記事は .NET Framework アプリに固有のものです。 .NET 5 以降 (および .NET Core) でのアセンブリの読み込みの詳細については、「.NET での依存関係の読み込み」を参照してください。

アセンブリの統一と既定のバインド

.NET Framework アセンブリへのバインドは、 アセンブリの統一というプロセスによってリダイレクトされる場合があります。 .NET Framework は、1 つのバージョンの共通言語ランタイムと、型ライブラリを構成する 24 個前後の .NET Framework アセンブリで構成されています。 これらの .NET Framework アセンブリは、ランタイムによって単一のユニットとして扱われます。 既定では、アプリを起動するとき、ランタイムによって実行されるコード内の型のすべての参照が、プロセスに読み込まれたランタイムと同じバージョン番号を持つ .NET Framework アセンブリにリダイレクトされます。 このモデルで発生するリダイレクトは、ランタイムの既定の動作となります。

たとえば、System.XML 名前空間の型が参照されるアプリが、.NET Framework 4.5 を使用して作成されている場合、ランタイム バージョン 4.5 と共に出荷された System.XML アセンブリへの静的参照が含まれます。 ここで、.NET Framework 4 と共に出荷された System.XML アセンブリを指すようにバインド参照をリダイレクトする場合は、リダイレクト情報をアプリ構成ファイルに追加します。 構成ファイルで、統一された .NET Framework アセンブリに対するバインド リダイレクトを設定すると、このアセンブリの統一が取り消されます。

また、使用できる複数のバージョンがある場合は、サードパーティ アセンブリのアセンブリ バインドを手動でリダイレクトすることもできます。

発行者ポリシーを使用してバージョンをリダイレクトする

アセンブリの販売元は、新しいアセンブリに発行者ポリシー ファイルを含めることにより、より新しいバージョンのアセンブリにアプリをリダイレクトできます。 発行者ポリシー ファイルは、グローバル アセンブリ キャッシュに配置され、アセンブリ リダイレクトの設定が格納されます。

アセンブリの major.minor バージョンごとに、独自の発行者ポリシー ファイルが割り当てられます。 たとえば、バージョン 2.0.2.222 から 2.0.3.000 へのリダイレクトと、バージョン 2.0.2.321 から 2.0.3.000 へのリダイレクトは、いずれもバージョン 2.0 に関連付けられているため、両方とも同じファイルに記述します。 ただし、バージョン 3.0.0.999 から 4.0.0.000 へのリダイレクトは、バージョン 3.0.999 のファイルに記述します。 .NET Framework のメジャー バージョンごとに、独自の発行者ポリシー ファイルが割り当てられます。

アセンブリの発行者ポリシー ファイルが存在する場合、ランタイムは、アセンブリのマニフェストとアプリ構成ファイルをチェックした後で、発行者ポリシー ファイルをチェックします。 販売元は、新しいアセンブリがリダイレクト元のアセンブリとの下位互換性を維持している場合にだけ、発行者ポリシー ファイルを使用するようにします。

発行者ポリシーの省略」で説明するように、アプリ構成ファイルで設定を指定することによって、アプリの発行者ポリシーを省略することができます。

アプリ レベルでバージョンをリダイレクトする

アプリ構成ファイルを通じてアプリのバインド動作を変更するには、いくつかの手法があります。手動でのファイルの編集自動バインド リダイレクトの利用、発行者ポリシーの省略によるバインド動作の指定を行うことができます。

手動でアプリ構成ファイルを編集する

手動でアプリ構成ファイルを編集して、アセンブリの問題を解決できます。 たとえば、販売元が、アプリで使用しているアセンブリの新しいバージョンをリリースしたが、下位互換性を保証していないために、発行者ポリシーを提供しない場合でも、次のように、アプリ構成ファイルにアセンブリ バインド情報を記述することによって、アプリで新しいバージョンのアセンブリを使用するように指示できます。

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

自動バインド リダイレクトを利用する

.NET Framework 4.5.1 以降のバージョンを対象とするデスクトップ アプリを Visual Studio で作成すると、そのアプリでは自動バインド リダイレクトを使用します。 これは、2 つのコンポーネントが同じ厳密な名前付きアセンブリの異なるバージョンを参照する場合、ランタイムは出力するアプリ構成ファイル (app.config) に新しいバージョンのアセンブリへのバインド リダイレクトを自動的に追加することを意味します。 このリダイレクトは、別の方法で発生する可能性があるアセンブリの統一をオーバーライドします。 ソース app.config ファイルは変更されません。 たとえば、アプリがアウトオブバンド .NET Framework コンポーネントを直接参照する場合に、同じコンポーネントの旧バージョンを対象とするサードパーティのライブラリを使用しているとします。 このアプリをコンパイルすると、出力されるアプリ構成ファイルは、新しいバージョンのコンポーネントへのバインド リダイレクトを含むように変更されます。 Web アプリを作成すると、バインドの競合に関するビルドの警告が表示され、ソース Web 構成ファイルに必要なバインド リダイレクトを追加するためオプションが示されます。

手動でソース app.config ファイルにバインド リダイレクトを追加する場合、Visual Studio ではコンパイル時に、追加されたバインド リダイレクトに基づいてアセンブリの統一を試行します。 たとえば、アセンブリの次のバインド リダイレクトを挿入するとします。

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

アプリ内の別のプロジェクトが同じアセンブリのバージョン 1.0.0.0 を参照する場合、自動バインド リダイレクトは、アプリがこのアセンブリのバージョン 2.0.0.0 で統一されるように、出力 app.config ファイルに次のエントリを追加します。

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

.NET Framework の旧バージョンを対象とするアプリの場合は、自動バインド リダイレクトを有効にできます。 どのアセンブリについても app.config ファイルにバインド リダイレクト情報を記述する、またはバインド リダイレクト機能をオフにすることで、この既定の動作をオーバーライドできます。 この機能を有効または無効にする方法については、「方法: 自動バインディング リダイレクトを有効/無効にする」を参照してください。

発行者ポリシーをバイパスする

アプリの構成ファイルの発行者ポリシーを必要に応じてオーバーライドできます。 たとえば、下位互換性を維持しているとされる新しいアセンブリ バージョンでも、アプリを破壊する可能性があります。 発行者ポリシーを省略する場合は、<publisherPolicy> 要素をアプリケーション構成ファイルの <dependentAssembly> 要素に追加し、apply 属性を no に設定することによって、以前の yes の設定がすべてオーバーライドされます。

<publisherPolicy apply="no" />

発行者ポリシーを省略することにより、アプリの実行を続行できますが、必ず、問題点をアセンブリの販売元に報告してください。 アセンブリに発行者ポリシー ファイルを提供した場合、販売元はそのアセンブリが下位互換性を維持していること、およびクライアントが可能な限り新バージョンを使用できることを確認する必要があります。

コンピューター レベルでバージョンをリダイレクトする

コンピューター管理者が 1 台のコンピューター上のすべてのアプリで特定のアセンブリ バージョンを使用する場合も、まれにあります。 たとえば、特定のバージョンでセキュリティ ホールが修正される場合があります。 コンピューターの machine.config という名前の構成ファイル内でアセンブリをリダイレクトした場合は、そのコンピューターで旧バージョンを使用しているすべてのアプリが新バージョンを使用するようになります。 コンピューター構成ファイルは、アプリ構成ファイルおよび発行者ポリシー ファイルよりもオーバーライドされます。 この machine.config ファイルは、32 ビット マシンの場合は %windir%\Microsoft.NET\Framework[version]\config\machine.config にあり、64 ビット マシンの場合は %windir%\Microsoft.NET\Framework64[version]\config\machine.config にあります。

構成ファイル内でアセンブリ バインドを指定する

アプリ構成ファイル、コンピューター構成ファイル、発行者ポリシー ファイルのいずれの場合も、同じ XML 形式を使用してバインド リダイレクトを指定できます。 あるバージョンのアセンブリを別のバージョンにリダイレクトするには、<bindingRedirect> 要素を使用します。 oldVersion 属性では、1 つのアセンブリ バージョンまたはバージョンの範囲を指定できます。 newVersion 属性では、1 つのバージョンを指定する必要があります。 たとえば、 <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 を使用するようにランタイムに指示します。

次のコード例は、さまざまなバインディング リダイレクトのシナリオを示しています。 この例では、 myAssemblyのバージョンの範囲に対するリダイレクトと、 mySecondAssemblyの単一のバインド リダイレクトを指定します。 この例では、発行者ポリシー ファイルによって myThirdAssemblyのバインド リダイレクトがオーバーライドされないことも指定しています。

アセンブリをバインドするには、<assemblyBinding> タグ内の xmlns 属性に対して文字列 "urn:schemas-microsoft-com:asm.v1" を指定する必要があります。

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

特定のバージョンにアセンブリ バインドを制限する

アプリ構成ファイルの <assemblyBinding> 要素で appliesTo 属性を使用して、アセンブリ バインドの参照を特定のバージョンの .NET Framework にリダイレクトできます。 このオプションの属性では、.NET Framework バージョン番号を使用して、適用するバージョンを指定します。 appliesTo 属性が指定されていない場合、<assemblyBinding> 要素は、.NET Framework のすべてのバージョンに適用されます。

たとえば、.NET Framework 3.5 アセンブリのアセンブリ バインドをリダイレクトするには、アプリ構成ファイルに次の XML コードを追加します。

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

バージョンの順序でリダイレクト情報を入力する必要があります。 たとえば、.NET Framework 3.5 アセンブリのアセンブリ バインド リダイレクト情報を入力し、次に .NET Framework 4.5 アセンブリの情報を入力します。 最後に、appliesTo 属性を使用しないためにすべてのバージョンの .NET Framework に適用される .NET Framework アセンブリ リダイレクトに関するアセンブリ バインディング リダイレクト情報を入力します。 リダイレクトで競合が発生した場合は、構成ファイル内で最初に一致したリダイレクト ステートメントが使用されます。

たとえば、ある参照を .NET Framework 3.5 のアセンブリにリダイレクトし、別の参照を .NET Framework 4 のアセンブリにリダイレクトするには、次の擬似コードに示すパターンを使用します。

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

関連項目