2015-02-24 67 views
1

我在PCL框架庫和使用庫的客戶端應用程序中都使用Nito.Async。 PCL lib的目標是.Net4.5 & SL5,客戶端是.Net4.5。Nuget PCL庫衝突

如果我不在客戶端應用程序中引用Nito.Async,一切都很好。但是,如果我引用它,當我運行的應用程序,一個MissingMethodException發生:

Method not found: 'Microsoft.Runtime.CompilerServices.TaskAwaiter`1<!0> Nito.AsyncEx.AwaitableDisposable`1.GetAwaiter()' 

挖多一點之後,似乎這個問題的MSBuild複製從portable-net40的NITO LIB由PCL LIB目標引用\ bin文件夾中,然後複製客戶端在目標\ bin中引用的net45中的Nito lib。因此,它會覆蓋第一個便攜式Nito.Async DLL ...並且當我啓動應用程序時,portable-net40被替換爲net45

我看到的只有很少的選項有:

  • 直接包含Nito.Async源在我的圖書館,但它意味着失去具有最多最新庫的優勢的NuGet ...
  • 問Stephen Cleary將.Net45目標的DLL重命名爲Nito.AsyncEx.Net45.dll而不是Nito.AsyncEx.dll(並針對每個不同的目標執行此操作),但我懷疑這是一個完美的解決方案。

我該如何處理這種DLL衝突?

對於這類問題,Nuget或MsBuild方面已經有了一些東西嗎?

回答

1

在這種情況下,便攜式版本應該替換爲net45版本。您收到的MissingMethodException意味着Nito.AsyncEx包中存在API兼容性錯誤。

看着the source code,我不確定有辦法解決這個問題。 GetAwaiter()返回TaskAwaiter<T>,但該類型對於面向Silverlight或.NET 4的可移植庫具有不同的標識(它位於不同的名稱空間中)。我認爲這是必需的,因爲構造函數是內部的,所以我們不得不重新實現便攜式異步支持尚未擁有它的平臺。

最簡單的解決方法是放棄對尚未支持PCL異步的任何平臺的支持。因此,您可以定位.NET 4.5,WP8,WP8.1和Windows 8商店應用程序。

+0

我的lib是SL5&.Net45中的雙客戶端...很難放棄SL5 ... – rducom 2015-02-24 19:55:17

+1

@sharped我在AsyncEx項目上提出了一個關於這個問題:https://github.com/StephenCleary/AsyncEx/issues/13 – 2015-02-24 21:11:30

+0

非常感謝,我永遠不會想象這個解決方案很簡單... – rducom 2015-02-24 21:26:24