18

問題の説明:

共有ライブラリ「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 ランタイムは参照されているアセンブリを見つけようとします。できない場合: ライブラリ ロード例外が生成されます。次のコメントも参照してください

いくつかの回避策があります。

  1. 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>
  1. 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 パッケージの回避策は必要ありません。

質問:

  1. 以前の正確なバージョンのパッケージ 4.1.1 があるのに、System.Net.Http v 4.3.0 パッケージに不一致の System.Net.Http.dll v 4.1.1 が含まれているのはなぜですか?
  2. 上記の 2 つの回避策のいずれかを使用する必要がありますか?
  3. どちらの方がよいですか?
  4. または: 問題に対する別の解決策はありますか?
  5. または: 不整合を修正する NuGet パッケージへの差し迫った更新はありますか?

ありがとう。

4

3 に答える 3

9

NuGet からSystem.Net.Http (バージョン 4.3.1) をインストールすることで、この問題を解決しました。

于 2017-04-07T08:43:06.207 に答える
4

答えの99%がすでにそこにあるので、私自身の質問に答えることが事実上正しいと思います.

github/corefx の開発チームは、System.Net.Http プロジェクトから System.Diagnostics.DiagnosticSource.dll へのハード リファレンスを削除するという性質上、この問題の解決が別の既知の問題修正の副作用であることを認めました。

それまでは、提供されている 2 つの回避策のいずれでも、個人の好みに基づいて使用できます。

于 2017-01-10T22:39:50.817 に答える