1. ホーム
  2. c#

[解決済み] アセンブリバインディングリダイレクト:どのように、そしてなぜ?

2022-04-25 01:31:50

質問

これは問題の質問ではなく、アセンブリバインディングのリダイレクトの動作に関する一般的な理解のための質問です。

クエリ

  1. バインディングリダイレクトでメジャーバージョンのみが表示され、マイナー、ビルド、リビジョン番号が表示されないのはなぜですか?
  2. メジャーバージョンに変更があった場合のみ、旧バージョンと新バージョンが変わるのですか?

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

解決方法は?

なぜバインディングリダイレクトが必要なのか?ライブラリBと、バージョン1.1.2.5のライブラリCを参照しているアプリケーションAがあるとします。ライブラリBもライブラリCを参照していますが、そのバージョンは1.1.1.0です。同じアセンブリの異なるバージョンを実行時にロードすることはできないので、ここで衝突が発生します。この衝突を解決するために、バインディング・リダイレクトを使用することがあります。そのためには、アプリケーションAのapp.configファイルの以下の部分に以下を追加します。 configuration > runtime > assemblyBinding セクション(参照 ここで は、完全な設定ファイルの例です)。

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

また、マッピングするバージョンの範囲を指定することもできます。

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

これで、バージョン 1.1.1.0 の C を参照してコンパイルされたライブラリ B は、実行時にバージョン 1.1.2.5 の C を使用することになります。もちろん、ライブラリCが後方互換性を持っていることを確認した方がよい。そうしないと、予期せぬ結果を招くかもしれない。

メジャーなライブラリだけでなく、あらゆるバージョンのライブラリをリダイレクトすることができます。