web-dev-qa-db-ja.com

アセンブリバインディングを下位バージョンにリダイレクト

私は2.5.0.0を使用するために4.0.0.0を使用するので、代わりにNServiceBus依存性をダウングレードしようとしています

私は次の方法で試していますが、どれもうまくいかないようです。

<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="NServiceBus"
                              publicKeyToken="9fc386479f8a226c" culture="neutral"/>
            <bindingRedirect oldVersion="4.0.0.0" newVersion="2.5.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

私もコードベースで試しました:

<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="NServiceBus"
                              publicKeyToken="9fc386479f8a226c"
                              culture="neutral"/>
            <codeBase version="2.5.0.0" href="NServiceBus.dll"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

それでも、灘。私はmsdnのドキュメントを調べましたが、この機能を後方の方法で使用することについては言及されていません。これは可能ですか?

15
Konstantinos

当社のクライアントはOfficeの更新に関して異なる状態にあるため、実際にはいくつかの相互運用DLLに対して最初のステートメントを使用しています。これは私が使用するコードです:

<runtime>
<assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="office" publicKeyToken="71E9BCE111E9429C" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="11.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>

これにより、DLLのバージョン14からバージョン11への下位互換性が提供されます。使用しているDLLへのリンクを提供できますか?

NServiceBusフレームワーク(バージョン3.3.8)をダウンロードし、ILSpyを使用してDLLを調査しました。 DLLでも同じことをすることをお勧めします。私のDLLの場合、あなたと同じ公開鍵トークンが表示されます。確かに、バージョン3.3.0.0ではなくバージョン4.0.0.0を使用しています。または、公開鍵トークンが一致しなかった可能性があります。

4
Romano Zumbé

MSDNによると: https://msdn.Microsoft.com/en-us/library/eftw1fys(v = vs.110).aspx

この値は、oldVersionより前のバージョンを指定できます。

newVersionbindingRedirect属性を参照します。 「備考」セクションにもあります。

新しいバージョンのアセンブリから古いバージョンのアセンブリにリダイレクトすることもできます。

彼らの例は次のとおりです。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

アプリケーション構成ファイルでの明示的なアセンブリバインディングリダイレクトにはセキュリティ権限が必要です についても言及されていることに気付きました。おそらくそれもあなたに影響を与えていますか?

2
drzaus

誤解しなかった場合は、最新バージョンをインストールしたstimulsoftレポートDDLで同じことを行いましたが、アプリケーションに2010.3が必要でした。ただし、構成ファイルとリダイレクトではありません。ソリューションエクスプローラーから参照を削除し、古いDLL参照を追加してから、copy Localプロパティを設定し、DLLになるように再コンパイルしました。同じディレクトリ内のアプリケーションを使用すると、すべてが正常に機能します。また、他のいくつかのdllでも同様に行いました。

1
Omid S.

上記の答えは良い答えですが、重要な部分が欠けています。また、コメントを読んだ場合、一部の開発者はこれが機能しているとはもはや信じていません。実際、これは、アップバージョンまたはダウンバージョンの両方で機能しています

重要:文化

私の実験では、文化をニュートラルに設定したときにのみ機能し始めました。 (上記の例には「en-us」があります)

_<assemblyIdentity name="..... culture="neutral"/>
_

私のセットアップでは、_Lib1_と_Lib3_を参照するWinAppがあります。 _Lib1_は_Lib2_および_Lib3_を参照します。 _Lib2_は_Lib3_を参照します。そして、ボタンを押すと、呼び出しがWinAppから_Lib3_(直接およびライブラリのチェーンを介して)まで伝播し、テキストが画面に表示されます。 _Lib3_は強い名前です。

実行1-カルチャセットなし[Assembly: AssemblyCulture("")]、バインディングリダイレクトセットなし-動作します!

実行2-Lib3の下位バージョン、バインディングリダイレクトを「en-us」に設定-失敗!

実行3-Lib3の下位バージョン、バインディングリダイレクトを「ニュートラル」に設定-動作します!アップバージョンとダウンバージョンで動作します。

他の実行では、設定[Assembly: AssemblyCulture("en-us")]で遊んでいますが、AssemblyCultureが空でない場合、すべての試行が失敗しました。実際、この属性をWinAppに設定すると、コンパイルすらされません。

エラーCS7059:実行可能ファイルをサテライトアセンブリにすることはできません。文化は常に空でなければなりません

だから、ここに行きます。 AssemblyCultureの役割の複雑さをすべて理解しているわけではないので、私の実験では、特定の条件下でバージョンリダイレクトが正常に機能することを証明するだけだと主張しています。

1
T.S.