1

我为我的 Simple.OData.Client 构建了一个 NuGet 包,支持 Xamarin Android 和 iOS。此库使用 Microsoft.Bcl.Async。使用 Android 和 iOS 模拟器进行的测试正常,但是当我将这个新的 NuGet 包安装到另一个项目中时,它无法编译 Droid/Touch 项目并显示以下消息:

C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(720,2): error : Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'Microsoft.Threading.Tasks.Extensions, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Perhaps it doesn't exist in the Mono for Android profile?
C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(720,2): error : File name: 'Microsoft.Threading.Tasks.Extensions.dll'

当然,目前还没有针对 Mono 平台的 Microsoft.Bcl.Async 包,另一方面,由于库测试在这些平台上通过,我想这更像是让 Visual Studio 满意而不是进行一些代码修改的挑战。

有没有人设法在依赖于 Microsoft.Bcl.Async 的 Mono PCL 上使用?

4

4 回答 4

1

一般来说,如果你的包中的代码依赖于另一个 NuGet 包,你需要声明一个包依赖,这样任何安装你的包的人都会得到你依赖的那个。那应该解决这样的问题。

但是,在这种情况下,情况要复杂得多。由于 Microsoft.Bcl.Async 不支持 Mono 平台,因此您不能声明该包依赖项(或者如果您这样做,它将始终无法安装)。不幸的是,Microsoft.Bcl.Async 的许可证将其限制为“Windows 平台”。我不是律师,但我认为这意味着您不应将 Microsoft.Threading.Tasks.Extensions.dll 作为软件包的一部分分发。最后,目前还没有针对 Mono 平台的官方 PCL 支持,所以如果您确实提出了一个现在可以使用的解决方案,那么当官方 PCL 支持出现时它可能会发生变化。

如果您想尝试使其工作,您基本上需要做的是创建自己的 DLL,其名称与 Microsoft.Bcl 和 Microsoft.Bcl.Async 中的名称相同,以便在 Mono 平台上使用。在这些程序集中,为 Mono 已经实现的类型(可能应该是 System.* DLL 中的类型)提出类型转发,并为其他的创建您自己的实现(AsyncBridge 源代码对此很有用) . 这就是我为我的 BUILD 2012 PCL 演示之一所做的。代码在这里。AsyncFacades 和 AsyncBridge 是相关项目。

于 2013-05-06T02:56:01.510 回答
1

对于那些在从 nuget 获取 Simple.oData.Client 时遇到这个问题的人,只需从 nuget 安装以下软件包:

Microsoft Bcl Async 便携式 Microsoft Bcl Async

于 2014-04-04T09:38:22.607 回答
0

我相信我找到了问题所在。

早些时候,我在 Simple.OData.Client nuspec 文件中有以下行:

<file src="Simple.OData.Client.Core\bin\Release\Microsoft.Threading.Tasks.Extensions.dll" target="lib\portable-net403+win8+sl5+wp8+MonoAndroid16+MonoTouch40\Microsoft.Threading.Tasks.Extensions.dll" />

这不是应该的,因为 Microsoft.Bcl.Async 应该负责复制 Tasks.Extensions.dll。我向 Microsoft 报告了此问题,并希望在 Microsoft.Bcl.Async 的 RTM 版本中修复此问题。显然不是,因此所有依赖于 Microsoft.Bcl.Async 的 NuGet 包仍应复制此文件。然后它将起作用。

于 2013-05-05T22:00:20.697 回答
0

对于谁有同样的问题,我认为你可以降级 System.Threading.Tasks.Extensions 4.4.0

于 2018-08-15T18:17:02.543 回答