【问题标题】:Searching for the best PCL profile for cross-platform development寻找用于跨平台开发的最佳 PCL 配置文件
【发布时间】:2013-05-09 14:11:48
【问题描述】:

我正在为我的应用程序扩展支持的平台数量,它曾经支持 .NET4/Windows Store/Windows Phone,但我希望也涵盖适用于 Android 和 iOS 的 Mono。我已经将所有业务逻辑、模型和视图模型都放到了可移植类库 (PCL) 中,但是我应该针对哪个平台子集,这是一个很大的难题。每种组合都会导致某些事情失败。以下是我可能使用的 4 个平台的结果:

Profile 78 (NET45+WP8+Store):TPL 没有问题,await/async 并支持 CallerMemberName 属性(用于 BindableBase 视图模型基类)。但是引用此类库的 Mono.Android 项目无法构建抱怨不存在的 System.Runtime.dll 应该被引用。

Profile 104 (NET45+SL4+WP75+Store):await/async 不起作用,找不到 CallerMember 名称,但如果我删除对它们的所有引用,Android 项目构建正常。

Profile 147 (NET403+SL5+WP8+Store):await/async 不起作用,找不到 CallerMember 名称,但如果我删除对它们的所有引用,Android 项目构建正常。

Profile 158 (NET45+SL5+WP8+Store):等待/异步不起作用,未找到 CallerMember 名称,但如果我删除对它们的所有引用,Android 项目构建良好。

所以我不确定该选择什么。配置文件 78、104、147 是有限的,配置文件 78 是唯一同时支持等待/异步和 CallerMemberName 使用 BindableBase 的配置文件,但它在 Android 上失败并抱怨 System.Runtime.dll。因此,如果您了解哪种 PCL 配置文件最适合针对 Mono 的 PCL,请分享您的想法。

【问题讨论】:

  • 请务必使用Microsoft.Bcl.Async(取决于Microsoft.Bcl)。这些将 async/await/CallerMemberName 支持添加到配置文件 104/147/158。
  • Microsoft.Bcl.Async 只能在 Windows 平台上分发(目前为止)。没有单声道。
  • @VagifAbilov 许可已在 Microsoft.Bcl.Async hanselman.com/blog/…987654321@上更改
  • @NateCook 是的,这是微软的一个伟大举措。

标签: mono xamarin.ios xamarin.android portable-class-library


【解决方案1】:

考虑个人资料编号很难 - 我更喜欢从平台的角度考虑。

理想情况下,我希望我的项目能够得到支持:

  • .Net 3.5 及更高版本
  • SL3 及更高版本
  • WP7.x 手机及更高版本
  • MonoDroid 1.6 及更高版本
  • MonoTouch iOS6 及更高版本
  • (Mac 桌面 OSX Lion)

我支持的主要 PCL 项目是 MvvmCross - 它需要像 ICommand 这样的 Mvvm '设施'。这些工具仅在 .Net 4.5 及更高版本的平台中可用...这是一个硬性限制 - 我对此无能为力 - 所以我的需求更改为:

  • .Net 3.5 及更高版本 .Net 4.5
  • SL3 及以上SL4 及以上
  • WP7.x 手机及更高版本
  • MonoDroid 1.6 及更高版本
  • MonoTouch iOS6 及更高版本
  • (Mac 桌面 OSX Lion)

有了这个选择,然后这将我引向一个个人资料编号 - 104(不知道平台是如何决定这个的......很久以前就放弃了!)

所以我已经将 MvvmCross 定位在配置文件 104 - 并且在仍然需要 WP7.x 支持时它会保留在那里。

这个选择确实意味着 MvvmCross 不能开箱即用地支持像 async/await 和 CallerMemberName 这样的东西 - 但这是我们决定做出的妥协 - 我们有用户 需要 WP7。


但是,有些人在询问 await/async...

要使用这些新功能,有一些 BCL.Async Nuget hack 可以让它们在配置文件 104 中工作...或者这些用户可以将他们的应用程序定位到更新的配置文件(不支持 WP7.x 和 SL4 的配置文件) ) - 这导致他们在配置文件 78 中构建他们的应用程序,但添加对我的配置文件 104 程序集的引用。

目前,这些解决方案都不适用于 Xamarin 双胞胎 - 例如。您遇到了诸如缺少 System.Runtime.dll 程序集之类的问题。但是,我预计当 Xamarin 正式支持 PCL(并经过一些 alpha/beta 测试后)时,这些问题将得到解决。这个官方支持现在很快就会到期 - 这就是为什么我不会花太多时间思考这些问题......


我预计 MvvmCross 将在中期内放弃对 WP7.x 和 SL4 的支持。当这种情况发生时,我们也可以将核心库移动到配置文件 78。


我知道的唯一一个已经开始支持 PCL 的大型平台是 ReactiveUI。我相信这个平台必须使用 profile 78,因为 Microsoft 的 Reactive 的 PCL 版本的目标是 78。

【讨论】:

  • 谢谢斯图尔特,一如既往的好答案。我必须检查 BindableBase 对我的应用程序的重要性。我猜你计划在 MvvmCross 中替换它。
  • 不知道 - 什么是 BindableBase?是否只是 github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross/… 添加了 CallerMemberName 方法?
  • BindableBase的本质部分是这样的:SetProperty(ref T storage, T value, [CallerMemberName] String propertyName = null) 所以它不仅仅是MvxNotifyPropertyChanged。
  • 在我看来,这是同一个类/函数——只是利用 c#5 的特性——当 MvvmCross 能够向前移动到 C#5 时,我们可能会将这种类型的方法添加到 @987654326 @。另外,我的猜测是,无论您从 BindableBase 获得的任何框架最初在 CallerMemberName 之前都有它,而且当时看起来不同 :) 无论如何,我在这个问题上一遍又一遍。
  • 好的,我想我有一个地方,我目前正在使用 BindableBase.SetProperty(在 Windows Store 上)。我将尝试仅使用 Mvx 重写它。
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 2010-09-30
  • 2014-11-28
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多