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”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 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 与下载的 dll v 4.0.1.0 不完全匹配。
  • 当强命名库引用的版本不完全匹配时,.NET 运行时仍会尝试查找引用的程序集。如果不能:生成库加载异常。另请参阅以下备注

有几种解决方法:

  1. app.config 选项:声明兼容版本(我们应该走多远?)在 app.config 中为任何“shared.dll” - 引用应用程序绑定重定向。
<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.Net.Http 的项目添加对 System.Diagnostics.DiagnosticSource v. 4.0.0.0 的 NuGet 引用,以抢占 dll 版本 4.0.1.0 的自动下载。此选项失去了自动更新 NuGet 依赖项的能力,但使应用程序的部署无需配置。

尽管正确的问题解决方案在于解决包所有者的上述 NuGet 包不一致问题,但有一种烦人的感觉。当在源处修复时,不需要 System.Net.Http 包消耗代码的解决方法。

问题:

  1. 为什么 System.Net.Http v 4.3.0 包包含不匹配的 System.Net.Http.dll v 4.1.1 而有更早的确切版本包 4.1.1?
  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 的硬引用,此问题解决将是另一个已知问题修复的副作用。

在那之前:根据个人喜好可以使用两种提供的解决方法中的任何一种。

于 2017-01-10T22:39:50.817 回答
0

在我的情况下

FileLoadException:无法加载文件或程序集“System.Diagnostics.DiagnosticSource,Version=4.0.3.0,Culture=neutral,Public KeyToken=cc7b13ffcd2ddd51”。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

开始时向 Asp.Net Core 2.0 项目添加了 Microsoft.AspNetCore.TestHost 包“2.1.0-preview2-final”。修复是安装稳定版本“2.0.2”

于 2018-05-09T13:22:37.417 回答