Nuget PCL library conflict
本文关键字:conflict library PCL Nuget | 更新日期: 2024-08-01 21:08:04
我在PCL框架库和使用该库的客户端应用程序中都使用Nito.Async。PCL库的目标是Net4.5&SL5,客户端为.Net 4.5。
如果我没有在客户端应用程序中引用Nito.Async,一切都很好。但如果我引用它,当我运行应用程序时,会出现MissingMethodException
:
Method not found: 'Microsoft.Runtime.CompilerServices.TaskAwaiter`1<!0> Nito.AsyncEx.AwaitableDisposable`1.GetAwaiter()'
经过进一步挖掘,问题似乎是msbuild从target''bin文件夹中PCL库引用的portable-net40
复制Nito库,然后从target''bn中客户端引用的net45
复制Nito。所以它覆盖了第一个可移植的Nito.Async DLL。。。当我启动应用程序时,portable-net40
会被net45
所取代。
我看到的仅有的几个选项是:
- 在我的库中直接包含Nito.Async源代码,但这意味着失去了拥有最新库的Nuget优势
- 请Stephen Cleary将他的.Net45目标的DLL重命名为类似
Nito.AsyncEx.Net45.dll
而不是Nito.AsyncEx.dll
(并对每个不同的目标进行重命名),但我怀疑这是否是一个完美的解决方案
如何处理这种DLL冲突?
Nuget或MsBuild方面是否已经为此类问题做好了准备?
在这种情况下,可移植版本应该被net45
版本所取代。您得到的MissingMethodException意味着Nito.AncEx包中存在API兼容性错误。
从源代码来看,我不确定是否有办法解决这个问题。GetAwaiter()
返回一个TaskAwaiter<T>
,但对于以Silverlight或.NET4为目标的可移植库,该类型具有不同的标识(位于不同的命名空间中)。我认为这是必要的,因为构造函数是内部的,所以我们必须重新实现该类,以便为那些还没有它的平台提供可移植异步支持。
对此,最简单的解决方案是从PCL中删除对任何尚未支持异步的平台的支持。因此,您可以针对.NET 4.5、WP8、WP8.1和Windows 8存储应用程序。