web-dev-qa-db-ja.com

アセンブリバインディングリダイレクト:方法と理由

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

クエリ

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

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

バインドリダイレクトが必要なのはなぜですか?ライブラリ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の下位互換性を確保することをお勧めします。そうしないと、予期しない結果が生じる可能性があります。

メジャーバージョンだけでなく、任意のバージョンのライブラリをリダイレクトできます。

97
Evk

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

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

enter image description here

20
amyth91