Nuget PCL 库冲突

Nuget PCL library conflict

我在 PCL 框架库和使用该库的客户端应用程序中都使用了 Nito.Async。 PCL 库针对.Net4.5 & SL5,客户端是.Net4.5。

如果我不在客户端应用程序中引用 Nito.Async,一切都很好。但是如果我引用它,当我 运行 应用程序时,会发生 MissingMethodException :

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

进一步挖掘后,问题似乎是 msbuild 从目标 \bin 文件夹中的 PCL 库引用的 portable-net40 复制 Nito 库,然后复制 Nito 库来自目标 \bin 中客户端引用的 net45。所以它覆盖了第一个可移植的 Nito.Async DLL...当我启动应用程序时,portable-net40net45.

取代

我看到的仅有的几个选项是:

如何处理这种 DLL 冲突?

是否已经在 Nuget 或 MsBuild 方面针对此类问题做了一些事情?

在这种情况下,便携式版本应该被 net45 版本取代。您得到的 MissingMethodException 意味着 Nito.AsyncEx 包中存在 API 兼容性错误。

查看 the source code,我不确定是否有解决此问题的方法。 GetAwaiter() returns a TaskAwaiter<T>,但是对于面向 Silverlight 或 .NET 4 的可移植库,该类型具有不同的标识(它在不同的命名空间中)。我认为这是必要的,因为构造函数是内部,因此我们必须重新实现 class 以实现对尚不具备它的平台的可移植异步支持。

最简单的解决方法是从 PCL 中删除对任何不支持异步的平台的支持。因此,您可以针对 .NET 4.5、WP8、WP8.1 和 Windows 8 个商店应用程序。