これは問題の質問ではなく、アセンブリバインディングリダイレクトの動作に関する一般的な理解の質問です。
クエリ
古いバージョンと新しいバージョンは、メジャーバージョンに変更がある場合にのみ変更されますか?
<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
セクションの下に以下を追加します(完全な構成ファイルの例については here を参照してください)。
<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の下位互換性を確保することをお勧めします。そうしないと、予期しない結果が生じる可能性があります。
メジャーバージョンだけでなく、任意のバージョンのライブラリをリダイレクトできます。
NewtonSoft.Jsonのリダイレクトのバインドに関する問題に遭遇しました。 win 10のファイルプロパティ「9.0.1.19813」でファイルバージョンを検索し、番号を検索し、リダイレクトが失敗し続けました。さらなる調査の結果、アセンブリバージョンではなくファイルバージョンを見ていることがわかりました。だから、人々はファイルバージョン(頻繁に変更されます)とアセンブリバージョン(Windows 10 File Explorerでは見ることができません)を間違えているのだろうかと思います。 DLLのアセンブリバージョンを表示するには、これをpowershellで実行できます。 dll名をバージョンを探したいものに置き換えます。
[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version
上記の結果は次のとおりです。
Major Minor Build Revision
----- ----- ----- --------
9 0 0 0
参考文献を参照してください:
Windows Vista以降で.NETアセンブリのアセンブリバージョンを表示する方法(WIndows 7、2008)?