2017-01-09 95 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的不同設置來得出同樣的結論,只有在此之後才找到解決方案。 –