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

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

**クエリ

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

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

        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
    </dependentAssembly>
ソリューション

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





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

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

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

解説 (19)

NewtonSoft.Jsonのバインディングリダイレクトに問題が発生しました。Win10のファイルプロパティでファイルのバージョンを調べ、9.0.1.19813"と番号を調べると、リダイレクトは失敗し続けました。さらに調査したところ、アセンブリのバージョンではなく、ファイルのバージョンを見ていることがわかりました。ということは、File Version(頻繁に変更される)とAssembly Version(windows10のFile Explorerでは見れない)を勘違いしている人が多いのかなと思います。 dllのAssembly Versionを確認するには、powershellで次のように実行します。**dll名をバージョン検索したいものに置き換えてください。

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

上記の結果は

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

参考文献:を参照

https://stackoverflow.com/questions/4147164/how-can-i-see-the-assembly-version-of-a-net-assembly-in-windows-vista-and-newer

https://support.microsoft.com/en-nz/help/556041

ここに画像の説明を入力1

解説 (1)