共享庫「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
- System.Diagnostics.DiagnosticSource訴4.0.0.0是不完全匹配到v下載DLL V4.0起.1.0。
- 當強命名庫引用的版本不完全匹配時,.NET運行時仍會嘗試查找引用的程序集。如果不能:將生成庫加載異常。還可以看到以下remark
有幾個解決方法:
- 的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依賴項的能力,但使應用程序無配置部署。
- 爲什麼System.Net.Http v 4.3.0包中包含的不匹配System.Net.Http.dll v 4.1.1雖然早確切版本4.1.1包?
- 我們應該繼續上面提到的兩種解決方法嗎?
- 哪一個更好?
- 或者:是否有另一種解決方案?
- 或者:是否有對NuGet包進行即時更新以修復不一致?
雖然正確的問題解決方案在於修復上述NuGet軟件包不一致的問題,但仍有一種嘮叨的感覺。在源中修復時,System.Net沒有解決方法。需要使用Http包的代碼。
問題:
謝謝。
我嘗試在.NET Framework 4.6項目上安裝'System.Net.Http' 4.3.0,並且綁定重定向是自動生成的。嘗試在[dotnet/corefx](https://github.com/dotnet/corefx/issues/new)GitHub問題跟蹤器上詢問此問題以獲取更多詳細信息。 –
謝謝,我將通過GitHub詢問。我曾嘗試刪除並重新添加引用(VS 20015),並且app.config保持不變(無綁定重定向)。請注意,我們的解決方案比單一裝配解決方案更復雜。它包含多個可執行文件和共享庫程序集。 –
@Joel Verhagen:在https://github.com/dotnet/corefx/issues/15031 –