2016-09-18 78 views
0

我正在爲我的WebApp和PCL使用Microsoft HTTP客戶端庫2.2.29。Microsoft.Net.Http庫MVC項目和PCL之間的衝突

這裏是鏈接:https://www.nuget.org/packages/Microsoft.Net.Http/

PCL使用System.Net.Http.Primitives.dll版本,29年7月1日因爲兼容性。

MVC項目正在拉動System.Net.Http.Primitives.dll版本4.2.29因爲它與4.5框架兼容。它也依賴於我的PCL。

如果我只建立我的WebApp,它工作正常,因爲它拉4.2.29版本。但是,如果我建立另一個項目取決於我的PCL(例如Xamarin APP),它將1.7.29版本引入web/bin文件夾,並且在Web Project上收到以下錯誤。

[FileLoadException:未能加載文件或組件 'System.Net.Http.Primitives,版本= 4.2.29.0,文化=中性 公鑰= b03f5f7f11d50a3a' 或它的一個依賴。位於程序集清單定義中的 與程序集 的引用不匹配。 (從HRESULT異常:0x80131040)]
System.Reflection.RuntimeAssembly._nLoad(的AssemblyName文件名,字符串 的代碼庫,證據assemblySecurity,RuntimeAssembly locationHint, StackCrawlMark & stackMark,IntPtr的pPrivHostBinder,布爾 throwOnFileNotFound,布爾forIntrospection,布爾 suppressSecurityChecks) 0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(的AssemblyName assemblyRef,證據assemblySecurity,RuntimeAssembly reqAssembly, StackCrawlMark & stackMark,IntPtr的pPrivHostBinder,布爾 throwOnFileNotFound,布爾forIntrospection,布爾 個suppressSecurityChecks)234
System.Reflection.RuntimeAssembly.InternalLoad(字符串assemblyString, 證據assemblySecurity,StackCrawlMark & stackMark,IntPtr的 pPrivHostBinder,布爾forIntrospection)108
System.Reflection.RuntimeAssembly.InternalLoad(字符串assemblyString, 證據assemblySecurity,StackCrawlMark & stackMark,布爾 forIntrospection)25 System.Reflection.Assembly.Load(字符串 assemblyString)34
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串 的AssemblyName,布爾starDirective)49

我在我的web.config以下配置:

<dependentAssembly> 
     <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" /> 
     </dependentAssembly> 

PCL packages.config

<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="portable45-net45+win8+wp8+wpa81" /> 

WEBAPP packages.config

<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net451" /> 

我可以刪除網頁。配置配置,使其與1.7.29版本一起工作。但我不想這樣做,我想使用每個項目的這個庫的最新兼容版本。

爲什麼在構建非相關項目時,VS 2015社區版/ nuget會將非兼容/較低版本的庫放入web/bin文件夾?

我該如何解決這個問題?

+0

你最好問MSBuild給你診斷。沒有這一點,不清楚是誰複製了舊版本。 –

+0

如何設置PCL項目目標?我爲.NET 4.5,Windows 8,Windows Phone 8和Xamarin Android創建了一個示例PCL項目。安裝Microsoft HTTP客戶端庫2.2.29後,System.Net.Http.Primitives.dll版本爲1.5.9。而且我沒有在我的WebApp中設置bindingRedirect,我的Xamrin應用程序和Web應用程序都可以構建成功。你可以在這裏分享一個示例項目來重現這個問題嗎? –

+0

@Wendy請在這裏看到https://github.com/reyou/CrossLibraryReference下載這個項目,並首先構建web應用程序並檢查bin文件夾,然後建立類庫2並再次檢查bin文件夾。如果可能的話請嘗試使用VS 2015社區版。這裏是我的經驗:https://github.com/reyou/CrossLibraryReference/tree/master/debugImages這次它發生在「System.Net.Http.Extensions.dll」 –

回答

0

我知道這不是一個經過驗證的解決方案,但我必須逐個從解決方案中刪除項目並重新添加。然後,我通過右鍵單擊項目並選擇依賴關係來重新映射項目依賴項。現在好像工作。當3個以上的項目彼此交叉引用時,VS構建順序可能會出現問題。