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


126

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

クエリ

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

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

メジャーバージョンだけでなく、どのバージョンでもかまいません。例:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk:私が見たすべての例は、メジャーバージョンのみを示しています。
Nikhil Agrawal 2017

4
まあそれらは単なる例であり、それが可能な唯一の方法であることはどこにも述べられていません。
Evk 2017

回答:


165

なぜバインドリダイレクトが必要なのですか?ライブラリーBを参照するアプリケーションAと、バージョン1.1.2.5のライブラリーCがあるとします。ライブラリーBは、ライブラリーCも参照しますが、バージョンは1.1.1.0です。実行時に同じアセンブリの異なるバージョンをロードできないため、ここで競合が発生します。この競合を解決するには、通常は新しいバージョンへのバインドリダイレクトを使用します(ただし、古いバージョンでも可能です)。これを行うには、configuration > runtime > assemblyBindingセクションの下でアプリケーションAのapp.configファイルに以下を追加します(完全な構成ファイルの例については、こちらを参照してください)。

<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に下位互換性があることを確認してください。そうしないと、予期しない結果が生じる可能性があります。

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


これらはどのファイルとどのセクションの下にありますか?誰かが参考のために、MSDNなどのソースへのリンクを提供できますか?検索エンジンのあらゆる領域からSO Q / A記事に人々がアクセスすることを忘れないでください。参照は重要です。1週間休暇を取る直前に、同僚に「アセンブリリダイレクトをexeファイルに追加する」ように言われて、私はここに着陸しましたが、この回答は素晴らしく見えますが、コンテキストと参照が不足しています。
tpartee 2017

有効な質問@tpartee、私は回答(ピアレビュー待ち)を編集して、configセクションとdocs.microsoft.com/en-us/dotnet/framework/configure-apps/…
Kobus Smit

1
アプリケーションAの構成ファイルの@AlexanderDerck-ライブラリが単体テストライブラリであり、何らかの意味で単体テストランナーによって「実行」される場合を除いて、ライブラリの構成ファイルには(私が知る限り)影響はありません。
Evk 2018

1
@AlexanderDerckが正確に求めていた多くのupvotesとさえ奨励金、で、週の質問のカップル前でしたが、誰も納得させる答えを提供することができませんでした- stackoverflow.com/q/48377474/5311735
EVK

1
@CodeEngine publicKeyTokenはアセンブリCを識別します。署名されたアセンブリのみがそれらを識別する公開鍵トークンを持っています。ここでは、トークンあなたはアセンブリ持っていることを考えることを見つけることができる方法についての関連質問です:stackoverflow.com/q/3045033/5311735は
EVK

55

NewtonSoft.Jsonのバインディングリダイレクトに関する問題に遭遇しました。win 10ファイルプロパティ「9.0.1.19813」でファイルバージョンを調べ、番号を調べたところ、リダイレクトが失敗し続けました。さらなる調査の結果、アセンブリバージョンではなくファイルバージョンを調べていることがわかりました。だから、人々はファイルバージョン(頻繁に変更される)とアセンブリバージョン(Windows 10のファイルエクスプローラーでは見ることができない)を間違えているのではないかと思います。DLLのアセンブリバージョンを確認するには、これをPowerShellで実行します。dll名を、バージョンを検索する名前に置き換えます。

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

上記の結果です。

Major  Minor  Build  Revision

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

9      0      0      0

参照を参照してください:

Windows Vista以降(WIndows 7、2008)で.NETアセンブリのアセンブリバージョンを確認するにはどうすればよいですか?

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

ここに画像の説明を入力してください


12
ファイルバージョンとアセンブリバージョンの違いを示すための賛成投票!!
mridの'16年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.