2017-01-09 101 views
12

描述:System.Net.Http NuGet包4.3.0参考上System.Diagnostics.DiagnosticSource生成System.IO.FileLoadException版本问题的4.0.0.0参考

共享库“shared.dll”项目引用System.Net.Http NuGet包4.3.0。引用Application “shared.dll” 失败,

System.IO.FileLoadException

无法加载文件或程序集“System.Diagnostics.DiagnosticSource,版本= 4.0.0.0,文化=中性公钥= 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诉4.0.0.0 enter image description here
  • System.Diagnostics.DiagnosticSource诉4.0.0.0是不完全匹配到v下载DLL V4.0起.1.0。
  • 当强命名库引用的版本不完全匹配时,.NET运行时仍会尝试查找引用的程序集。如果不能:将生成库加载异常。还可以看到以下remark

有几个解决方法:

  1. 的app.config选项:在app.config中声明兼容的版本(我们应该走多远有吗?)有binding redirection用于任何 “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> 
  • 力System.Diagnostics.DiagnosticSource.dll到4.0.0.0版本: 添加的NuGet参照System.Diagnostics.DiagnosticSource V4.0起。 0.0到项目引用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. 我们应该继续上面提到的两种解决方法吗?
    3. 哪一个更好?
    4. 或者:是否有另一种解决方案?
    5. 或者:是否有对NuGet包进行即时更新以修复不一致?

    谢谢。

    +1

    我尝试在.NET Framework 4.6项目上安装'System.Net.Http' 4.3.0,并且绑定重定向是自动生成的。尝试在[dotnet/corefx](https://github.com/dotnet/corefx/issues/new)GitHub问题跟踪器上询问此问题以获取更多详细信息。 –

    +0

    谢谢,我将通过GitHub询问。我曾尝试删除并重新添加引用(VS 20015),并且app.config保持不变(无绑定重定向)。请注意,我们的解决方案比单一装配解决方案更复杂。它包含多个可执行文件和共享库程序集。 –

    +0

    @Joel Verhagen:在https://github.com/dotnet/corefx/issues/15031 –

    回答

    4

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

    开发团队在github上/ corefx承认this issue分辨率将是另一个known issue修复通过从System.Net.Http项目硬参考System.Diagnostics.DiagnosticSource.dll性质的副作用。

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

    +0

    开设门票感谢您节省我的一天。我是否正确,如果这个问题是由微软的软件包中的不正确的元数据创建的(意味着它不应该很难修复)? – Benni

    +0

    在我看来,这是一个按设计行为(强类型的装配设计) –

    4

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

    +0

    也为我解决了它! – Sam

    +0

    花了我2天的时间研究并尝试使用oldVersion - > newVersion的不同设置来得出同样的结论,只有在此之后才找到解决方案。 –