System.Net.Http NuGet包4.3.0引用在System.Diagnostics.DiagnosticSource ver 4.0.0.0参考上生成System.IO.FileLoadException

Ser*_*lov 16 dll system.net fileloadexception nuget-package .net-4.6.2

问题描述:

共享库"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 ver 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选项:在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>
Run Code Online (Sandbox Code Playgroud)
  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. 为什么System.Net.Http v 4.3.0软件包包含不匹配的System.Net.Http.dll v 4.1.1,而有早期版本的软件包4.1.1?
  2. 我们应该继续上面提到的2种解决方法吗?
  3. 哪一个更好?
  4. 或者:这个问题有另一个解决方案吗?
  5. 或者:NuGet包是否有即时更新来修复不一致性?

谢谢.

Ole*_*syk 9

我解决了从NuGet 安装System.Net.Http(版本4.3.1)的问题.


Ser*_*lov 4

我觉得回答我自己的问题实际上是正确的,因为 99% 的答案已经存在。

github/corefx 的开发团队承认,此问题解决方案是另一个已知问题修复的副作用,其本质是从 System.Net.Http 项目中删除对 System.Diagnostics.DiagnosticSource.dll 的硬引用。

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