web-dev-qa-db-ja.com

アセンブリバインディングのリダイレクトが機能しない

次のapp.configを使用して、アセンブリバインディングリダイレクトを設定しようとしています。

_<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.AnalysisServices"
                          PublicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="10.0.0.0"
                         newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
_

指定された公開キートークンを使用して、GACのバージョン9.0.242.0のマシンでプログラムを実行しています。 CLRは、そのバージョンを使用するためにバインディングをリダイレクトしようとさえしていないようです。

Fuslogvw.exeで取得できるものを次に示します。

_LOG: This bind starts in default load context. LOG: Using application configuration file: \Debug\AssemblyRedirectPOC.exe.Config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config. LOG: Post-policy reference: Microsoft.AnalysisServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 LOG: GAC Lookup was unsuccessful. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.EXE. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.EXE. LOG: All probing URLs attempted and failed._

9.0.242.0バージョンのdllをプローブパスに配置しようとすると、代わりに次のようになります。

LOG: Assembly download was successful. Attempting setup of file: \Debug\Microsoft.AnalysisServices.dll LOG: Entering run-from-source setup phase. LOG: Assembly Name is: Microsoft.AnalysisServices, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 WRN: Comparing the Assembly name resulted in the mismatch: Major Version ERR: The Assembly reference did not match the Assembly definition found. ERR: Failed to complete setup of Assembly (hr = 0x80131040). Probing terminated.

また、app.configで「9.0.0.0」ではなく「9.0.242.0」を使用するようにリダイレクトを変更しようとしましたが、動作しませんでしたが、違いはないと思います。

私が理解していることから、バインディングをリダイレクトすることの全体のポイントは、プログラムが構築されたものと一致しないバージョンを使用することです。ここに何かが完全に欠けていますか?私がやろうとしていることは可能ですか、可能であれば、なぜそれが機能しないのかという考えはありますか?

乾杯、アダム

30
Adam

構成XMLのタイプミスが原因である可能性があります。ローダーはあなたの設定を見ることができません。エラーがスキーマ名の「-」ではなく「=」にあることに気付くまで、1時間も頭痛の種がありました。

<assemblyBinding xmlns="urn:schemas=Microsoft-com:asm.v1">

すべての属性名と値を注意深く確認してください。 「PublicKeyToken」は「publicKeyToken」であるべきだと思います

これは動作するはずです:

<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.AnalysisServices" publicKeyToken="89845dcd8080cc91" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="9.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
</configuration>
26
Shrike

<configuration>タグには名前空間属性がありません。それ以外の場合は<assemblyBinding>タグは無視されます。

違う:

<configuration xmlns="http://schemas.Microsoft.com/.NetConfiguration/v2.0">

正しい:

<configuration>

https://stackoverflow.com/a/12011221/15037 から)

17
German Latorre

AssemblyBinding要素の名前空間が欠落しているため、アセンブリバインディングリダイレクトが機能しないことがありました。

正しい

<assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
    <bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
  </dependentAssembly>

不正解

不足しているメモ:xmlns = "urn:schemas-Microsoft-com:asm.v1"

<assemblyBinding>
  <dependentAssembly>
    <assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
    <bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
  </dependentAssembly>
11
Edward Wilde

私の場合、私は削除しなければなりませんでした

appliesTo="v2.0.05727" 

から

<assemblyBinding appliesTo="v2.0.05727" xmlns="urn:schemas-Microsoft-com:asm.v1">
5
sawe

BindingredirectsをMachine.Configに移動するだけで機能するという同様の問題がありました。アプリをクライアントに配布するため、これはwinformアプリの理想的なソリューションではありませんでした。

解決策:

.configファイルがアプリケーションの実行元のディレクトリにあることを確認してください。例えばAppNameが「MyApp」の場合、リダイレクトはアプリケーションディレクトリの「MyApp.exe.Config」ファイルにある必要があります。

サードパーティのdllを使用するコードがソリューション内の別のdllにあり、.dll.configを追加しても役に立たない場合でも、これを行う必要がありました。

4
Patel

バインディングリダイレクト構成をmachine.configファイルに移動すると、問題が解決しました。

3
F34R

偏心パスワードポリシーにより、構成内のassemblyBinding項目が無視される場合もあります。 「&」や「^」などの文字は、明らかに設定ファイルでは許可されていません。 Assembly Binding Log Viewerを数時間いじった後、Notepad ++のXMLツールがこれを明らかにしました。

1
jscheppers

ASP.NET開発ツールパーツなしでVisual Studio 2017をインストールした場合、Webプロジェクトがロードされ、コンパイルおよびビルドされます。 web.configファイルの処理方法がわからないため、NuGetパッケージのバージョンに関する警告が表示されるだけで、バインドのリダイレクトが表示されません。

インストールを修正することで問題は解決しましたが、それを見つけるのに永遠に時間がかかりました。

Visual Studio Installer screenshot

1
Bakanekobrain

誰かに助けがあれば、newVersionにフルバージョンを入れなかったので、これに遭遇しました。つまり、newVersion="3.0.1" の代わりに newVersion="3.0.1.0"

0
JohnnyFun

特に、Shrikeからの回答に感謝します。開発で機能するアプリケーションが1つありましたが、デプロイされたバージョンでは機能しませんでした。もっとよく見ると、本番環境でこれがありましたが、開発とは一致しませんでした。

  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly xmlns="">
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

dependentAssembly xmlns = ""が原因でした。私が私の答えをあなたの答えと比較し、それを修正するとすぐに、それは機能していました。助けてくれてありがとう

0
Wayne

エラー「xxxの明示的なバインディングリダイレクト、Culture = neutral、PublicKeyToken = xxx」が自動生成されたバインディングリダイレクトと競合するかどうかを確認します

出力ウィンドウに表示されます(エラーウィンドウには表示されません)

0
Markus

苦労している人のための追加ソリューション

<dependentAssembly>には1つの<assemblyIdentity>と1つの<bindingRedirect>。私のシナリオでは、1つに2つがあり、複数のバインディングリダイレクトのカスケードエラーが発生していました

<dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />

        <assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.4.2.0" newVersion="4.4.2.0" />
</dependentAssembly>

これは、4.4.2.0へのSimpleInjectorバインディングの代わりに、5.2.3.0へのバインディングであったため、System.Web.Mvcを適切にバインドできなかったというエラーが発生し、本当の問題が隠されていたことを意味します

0