我建立了一个NuGet包我Simple.OData.Client与Xamarin的Android和iOS的支持。 此库使用Microsoft.Bcl.Async。 使用Android和iOS模拟器测试就OK,但是当我安装这个新的NuGet包到另一个项目,它无法编译的Droid /触摸项目的以下信息:
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'
当然也有单声道平台没有Microsoft.Bcl.Async包(还),而另一方面由于库测试通过在这些平台上,我想这更是一个挑战,使Visual Studio的快乐,而不是做一些修改代码。
有没有人设法在Mono PCLS使用依赖于Microsoft.Bcl.Async?
一般来说,如果在你的包的代码依赖于其他NuGet包,你需要声明一个包的依赖,使任何安装程序包将让你依靠太之一。 这应该采取这样的问题护理。
然而,在这种情况下,它是一个复杂得多。 由于Microsoft.Bcl.Async不支持单声道的平台,您可以不声明包的依赖(或者,如果你没有它总是无法安装)。 不幸的是,Microsoft.Bcl.Async许可它限制为“Windows平台”。 我不是律师,但我认为这意味着你不应该发布Microsoft.Threading.Tasks.Extensions.dll为您包的一部分。 最后,还有单声道平台没有正式支持PCL还,所以如果你不拿出的作品现在当官方支持PCL出来它可能会改变一个解决方案。
如果你想尝试得到这个工作,你基本上需要做的是用相同的名字创建自己的DLL如在Microsoft.Bcl和Microsoft.Bcl.Async对单平台上使用。 在这些组件中,把型前锋的类型的单已经实现了(这大概应该是在系统的类型。*的DLL),并为其他的你自己的实现(AsyncBridge源代码是很有用的这个) 。 这是我做我的BUILD 2012 PCL演示之一。 该代码是在这里 。 AsyncFacades和AsyncBridge是相关的项目。
对于那些跌进从的NuGet获取Simple.oData.Client此问题时,只需要安装从的NuGet以下软件包:
微软的Bcl异步便携式微软的Bcl异步
我相信我已经找到了问题。
此前我曾在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.Bcl.Async的RTM版本。 显然不是,所以全部依赖Microsoft.Bcl.Async的NuGet包还是应该复制此文件。 然后,它会奏效。
对于谁拥有了同样的问题,我认为你可以降级System.Threading.Tasks.Extensions 4.4.0