問題の説明:
共有ライブラリ「shared.dll」プロジェクトは、System.Net.Http NuGet パッケージ 4.3.0 を参照します。「shared.dll」を参照するアプリケーションが失敗する
System.IO.FileLoadException
ファイルまたはアセンブリ 'System.Diagnostics.DiagnosticSource、Version=4.0.0.0、Culture=neutral、PublicKeyToken=cc7b13ffcd2ddd51' またはその依存関係の 1 つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULT からの例外: 0x80131040)
System.Net.Http.WinHttpHandler.SendAsync(...) で
この問題を調査した結果、上記の失敗の原因として次のことがわかりました。
- System.Net.Http v 4.3.0のパッケージ情報ページには、 System.Diagnostics.DiagnosticSource v 4.3.0以降への依存関係が記載されています。このパッケージは、プロジェクトから System.Net.Http v 4.3.0 が参照されると、自動的にダウンロードされます。
- 実際、System.Net.Http v 4.3.0 の NuGet パッケージには、System.Net.Http.dll v 4.1.1.0 が含まれています (2017 年 1 月 8 日現在)。
- System.Diagnostics.DiagnosticSource v 4.3.0 の NuGet パッケージには、実際には System.Diagnostics.DiagnosticSource v 4.0.1.0 が含まれています (2017 年 1 月 8 日現在)。
- System.Net.Http バージョン 4.1.1.0 は、System.Diagnostics.DiagnosticSource v. 4.0.0.0 を参照します。
- System.Diagnostics.DiagnosticSource v. 4.0.0.0 は、v ダウンロードした dll v 4.0.1.0 と完全に一致しません。
- 厳密に名前が付けられたライブラリ参照のバージョンが完全に一致しない場合でも、.NET ランタイムは参照されているアセンブリを見つけようとします。できない場合: ライブラリ ロード例外が生成されます。次のコメントも参照してください
いくつかの回避策があります。
- app.config オプション:アプリケーションを参照している "shared.dll"の app.configでバインディング リダイレクトを使用して、互換性のあるバージョンを宣言します (どこまでやればよいでしょうか?)。
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> </dependentAssembly> </assemblyBinding>
- System.Diagnostics.DiagnosticSource.dll を強制的にバージョン 4.0.0.0 にする: System.Diagnostics.DiagnosticSource v. 4.0.0.0 への NuGet 参照を、System.Net.Http を参照するプロジェクトに追加して、dll バージョン 4.0.1.0 の自動ダウンロードを回避します。このオプションでは、NuGet 依存関係を自動的に更新する機能が失われますが、アプリケーションの展開は構成なしになります。
適切な問題の解決策は、パッケージの所有者による前述の NuGet パッケージの不一致を修正することにあるというしつこい気持ちがあります。ソースで修正すると、コードを消費する System.Net.Http パッケージの回避策は必要ありません。
質問:
- 以前の正確なバージョンのパッケージ 4.1.1 があるのに、System.Net.Http v 4.3.0 パッケージに不一致の System.Net.Http.dll v 4.1.1 が含まれているのはなぜですか?
- 上記の 2 つの回避策のいずれかを使用する必要がありますか?
- どちらの方がよいですか?
- または: 問題に対する別の解決策はありますか?
- または: 不整合を修正する NuGet パッケージへの差し迫った更新はありますか?
ありがとう。