我正在努力为我的应用程序扩展支持的平台数量,它曾用于支持.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有经验,请分享您的想法。
考虑简档数字很难 - 我更愿意考虑平台。
理想情况下,我喜欢我的项目支持:
- .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。