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-net40
被 net45
.
取代
我看到的仅有的几个选项是:
- 直接在我的库中包含 Nito.Async 源代码,但这意味着失去拥有最新库的 Nuget 优势...
- 请 Stephen Cleary 将他的 .Net45 目标 DLL 重命名为
Nito.AsyncEx.Net45.dll
而不是 Nito.AsyncEx.dll
之类的名称(并为每个不同的目标执行此操作),但我怀疑这是一个完美的解决方案。
如何处理这种 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 个商店应用程序。
我在 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-net40
被 net45
.
我看到的仅有的几个选项是:
- 直接在我的库中包含 Nito.Async 源代码,但这意味着失去拥有最新库的 Nuget 优势...
- 请 Stephen Cleary 将他的 .Net45 目标 DLL 重命名为
Nito.AsyncEx.Net45.dll
而不是Nito.AsyncEx.dll
之类的名称(并为每个不同的目标执行此操作),但我怀疑这是一个完美的解决方案。
如何处理这种 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 个商店应用程序。