[原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening
[原文发表时间] 2013-7-9
可移植类库可以成为幸福的小特性。这些类库正在稳定发展,按照它们的意愿做着事情,并且变得很流行,以一种很好的方式流行着。
如果你没有为一个以上的平台写过.Net应用程序,那么你可能还没遇到过这些可移植类库。然而对那些编写过.Net程序并且希望程序能够在手表,手机,平板,Xboxen,桌面,云等所有平台都能正确运行的程序员来说,他们非常享受于可移植类库提供给他们的东西。
虽然还有几个技术方面和法律方面的难题,但是我确信这些问题都可以被解决掉,并且我们也将会创建非常棒的,在哪儿都能用的二进制类库。
最近.Net 社区有一系列围绕着可移植类库和跨平台.NET展开的活动。总而言之,可移植类库开始被广泛应用,越来越多支持移植的类库被发布,并且在跨平台应用程序中,MVVM模式正被证明是一种非常棒的最大化代码共享的方式。
可移植类库发布一览
首先,最近有一堆新可移植类库已被发布。其中有三个来自于GitHub的 Paul Betts:
接下来,是Scott LoveGrove自白:
我(Scott LoveGrove)此刻可能有点儿痴迷于PCLs。#我有一个问题(链接)
所以Scott(Scott LoveGrove)已经发布了四个用于访问web services的可移植类库:
另外一个新发布的可移植类库是Budgie,用于访问Twitter。.Net小组和Azure小组同样也发布了一大堆可移植类库。
.Net 小组:
其他小组:
更不用说那些你已经很熟悉的优秀可移植类库。
MVVM
IoC
其他
当然了,我最爱HttpClient包,它让Http调用更加方便。几个月以前就有了。
1: public static async Task<HttpResponseMessage> GetTheGoodStuff()
2: {
3: var httpClient = new HttpClient();
4: HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://hanselman.com/blog/");
5: var response = await httpClient.SendAsync(request);
6: return response;
7: }
//build/
一个build与会者对于演讲者说的“你不能通过可移植类库使用某平台的独有功能”提出了质疑,同时还专门写了一篇博文,说明如何使用抽象化以及依赖注入(更适宜)来解决不能通过可移植类库使用某平台独有功能的问题。
最近至少在2种场合下,我都听到过演说者告诉他们的听众,你不能通过一个可移植类库去引用一个特定目标的 .NET类库(例如像.Net Framework4.5的类库)。虽然严格来说是这样的,但它并没说清楚这整个事实。即使我们无法引用特定目标的类库,但我们仍���以使用这些类库。我们可以调用它们提供的方法,访问它们的属性。我们可以通过一个抽象化手段来获取访问这些类库的权限。我自己更倾向于使用依赖注入的方式。
跨平台.Net 真酷
“Draw a Stickman EPIC。” (画个火柴人)是我跟其他民间的一些开发人员一起做的一款游戏,它里头有大量的代码复用的例子。这个应用有95%以上的代码复用率,全都是用C#写的,每一个app商店都有都可用。再说一点其他的。
此外,请你一定要先看看我在Xamarin Evolve会议中的演讲(c#如何拯救了我的婚姻)。现在我将要谈谈可移植类库。我们可以从MonkeySpace Conference in Chicago in July of 2013 得到更多关于可移植类库的消息。
British and Irish Lions app 应用是一款定位于Windows商店,windows phone,IOS 和安卓的跨平台应用程序。它使用可移植类库,用于共享平台之间的通用代码,用到了从Azure到主机的服务,还用了我非常痴迷的MVVMCross MVVM framework。英国的MSDN博客写了一篇关于这款APP开发的一个学习实例,这儿还有一个更好的学习实例(带了截图啊,图表啊等等)以及一个开发人员写的博文。由于参考了Xamarin,MVVmCross,以及可移植类库,开发人员声明到,“考虑到The Lions app只给了很短的时间(从第一行代码的开发到第一个版本的发布,只用了不到三个月的时间),没有通用内核我们根本不可能交付一个跨所有平台的本地化丰富的程序。”
另一个用了MVVMCross的跨平台应用是Aviva Drive。这是一个保险公司的app,你可以用来跟踪你的驾驶习惯,从而很有希望在保险费上获取这款。这款应用在欧洲技术大会—第一天主题(about 28:40 in)上作为特色,大会关注它的焦点在于,它如何使用了Azure。
在游戏应用这方面,Taptitude是一款非常成功的Windows Phone7的游戏(或者说,是一个非常成功的迷你游戏的集合),它在MonoGame 和Xamarin的帮助下,已经被移植到了window phone8,windows 商店,IOS和安卓上。开发小组报告说,在所有平台上,他们有多达99%以上的代码共享部分,这对他们来说尤其重要,因为他们每周都在更新这款游戏。
Xamarin
Xamarin 已经发布了一个非常不可思议.NET Mobility Scanner,它能够分析代码并且告诉你它是如何“移植”的,并且它将如何的兼容Xamarin Android,Xamarin iOS,Windows Phone 以及Windows store。它能列举出那些在所有平台上你代码中用到的无效API,还列出你的代码“可移植性”的总体百分比。它执行起来非常灵活,而且跟我们一直以来想要可移植类库拥有的功能很类似。这里有一个用于SignalR 客户端类库的样本报告。它最棒的部分在于,不用给Xamarin发送你的代码或者二进制文件,就能够做所有的分析。这些全部都是在浏览器上进行的。我非常喜欢Xamarin了。
Phil Haack(以前是ASP.Net MVC的经理,现在在GitHub工作)写了一篇博文,标题叫做 Platform Limitations Harm.NET。他提出,windows platform limitations 应该为BCL NuGet包让路,从EULAs中移除。
我个人对此表示赞同。能够复用已存在的代码,创建可移植类库,还能写在64k或者64gigs中跑的apps,这使得.NET成为一个非常有趣的开发平台工具。