问题 寻找跨平台开发的最佳PCL配置文件


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

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

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

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

配置文件158(NET45 + SL5 + WP8 + Store):await / async不起作用,找不到CallerMember名称,但是如果删除对它们的所有引用,Android项目构建正常。

所以我不确定该选择什么。配置文件78,104,147是有限的,配置文件78是唯一支持await / async和CallerMemberName使用BindableBase的配置文件,但它在Android上失败,抱怨System.Runtime.dll。因此,如果您对PCL配置文件最适合PCL定位Mono有经验,请分享您的想法。


9166
2018-05-09 14:11


起源

一定要用 Microsoft.Bcl.Async (这取决于 Microsoft.Bcl)。这些为配置文件104/147/158添加了async / await / CallerMemberName支持。 - Stephen Cleary
Microsoft.Bcl.Async只能在Windows平台上发布(到目前为止)。没有单声道。 - Vagif Abilov
@VagifAbilov许可已在Microsoft.Bcl.Async上更改 hanselman.com/blog/... - Nate Cook
@NateCook是的,这是微软的一个很好的举动。 - Vagif Abilov


答案:


考虑简档数字很难 - 我更愿意考虑平台。

理想情况下,我喜欢我的项目支持:

  • .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(不知道平台如何决定这个......很久以前放弃了询问!)

所以我在104版本上定位了MvvmCross - 它仍将保留在那里,同时仍需要WP7.x支持。

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


但是,有些人在询问等待/异步......

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

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


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


我知道已启动PCL支持的唯一其他大型平台是ReactiveUI。我相信这个平台 必须 使用配置文件78,因为Microsoft的Reactive的PCL版本的目标是78。


11
2018-05-09 14:33



谢谢斯图尔特,一如既往地回答。我必须检查BindableBase对我的应用程序有多重要。我想你在MvvmCross中计划了一些替代品。 - Vagif Abilov
Dunno - 什么是BindableBase?它只是 github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross/... 随着 CallerMemberName 方法补充? - Stuart
BindableBase的基本部分是:SetProperty <T>(ref T storage,T value,[CallerMemberName] String propertyName = null)所以它不仅仅是MvxNotifyPropertyChanged。 - Vagif Abilov
在我看来,这是相同的类/功能 - 只是使用c#5功能 - 当MvvmCross能够向前移动到C#5时,我们可能会添加这种类型的方法 MvxNotifyPropertyChanged。还有我的 猜测 是你得到的任何框架 BindableBase 从以前开始 CallerMemberName 然后它看起来不同了:)无论如何,从我这个问题上来回徘徊。 - Stuart
好的,我想我有一个地方,我目前正在使用BindableBase.SetProperty(在Windows应用商店中)。我将尝试仅使用Mvx重写它。 - Vagif Abilov