System.Net.Http NuGet包4.3.0引用在System.Diagnostics.DiagnosticSource ver 4.0.0.0 reference

时间:2017-01-09 14:48:13

标签: dll nuget-package system.net fileloadexception .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)

     

at 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 enter image description here
  • System.Diagnostics.DiagnosticSource v.4.0.0.0与v下载的dll v 4.0.1.0不完全匹配。
  • 当强名称库引用的版本不完全匹配时,.NET运行时仍会尝试查找引用的程序集。如果它不能:生成库加载异常。另请参阅以下remark

有几种解决方法:

  1. app.config选项:在app.config中为任何" shared.dll"声明兼容版本(我们应该在多大程度上使用?)和binding redirection - 引用应用程序。
  2. <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依赖关系,但无需部署应用程序配置。
    2. 虽然正确的问题解决方案在于修复上述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包是否有即时更新来修复不一致性?
      6. 感谢。

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

github / corefx的开发团队承认this issue解决方案将是另一个known issue修复的副作用,因为从System.Net中删除对System.Diagnostics.DiagnosticSource.dll的硬引用的性质.Http项目。

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

答案 2 :(得分:0)

就我而言

  

FileLoadException:无法加载文件或汇编   &#39; System.Diagnostics.DiagnosticSource,Version = 4.0.3.0,   Culture = neutral,Public KeyToken = cc7b13ffcd2ddd51&#39;。位于   程序集的清单定义与程序集引用不匹配。   (HRESULT异常:0x80131040)

什么时候开始向Asp.Net Core 2.0项目添加了Microsoft.AspNetCore.TestHost包&#34; 2.1.0-preview2-final&#34;。 解决方法是安装稳定版本&#34; 2.0.2&#34;