[原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening

[译文发表地址] .Net 跨平台可移植类库正在进行

[原文发表时间] 2013-7-9

可移植类库可以成为幸福的小特性。这些类库正在稳定发展,按照它们的意愿做着事情,并且变得很流行,以一种很好的方式流行着。

如果你没有为一个以上的平台写过.Net应用程序,那么你可能还没遇到过这些可移植类库。然而对那些编写过.Net程序并且希望程序能够在手表,手机,平板,Xboxen,桌面,云等所有平台都能正确运行的程序员来说,他们非常享受于可移植类库提供给他们的东西。

虽然还有几个技术方面和法律方面的难题,但是我确信这些问题都可以被解决掉,并且我们也将会创建非常棒的,在哪儿都能用的二进制类库。

最近.Net 社区有一系列围绕着可移植类库和跨平台.NET展开的活动。总而言之,可移植类库开始被广泛应用,越来越多支持移植的类库被发布,并且在跨平台应用程序中,MVVM模式正被证明是一种非常棒的最大化代码共享的方式。

可移植类库发布一览

首先,最近有一堆新可移植类库已被发布。其中有三个来自于GitHub的 Paul Betts

  • Reactive UI - Reactive UI 是一个构建于Reactive Extensions 之上的MVVM framework。上周已经发布了5.0版本,这是一个“完全友好性”可移植版本,并且支持以下平台:
    • Xamarin iOS
    • Xamarin Android
    • Xamarin Mac
    • .Net 4.5(WPF)
    • Windows Phone 8
    • Windows Store Apps(WinRT)
  • Akavache- 一个异步的,持久的键值存储。3.0版本包含了PCL(Portable Class Library)支持,该版本上周也已经被分布了。所以现在,你的几乎所有的序列化和网络访问层代码都可以跨平台了。Akavache所支持的开发平台跟Reactive UI的一样。这真的是一个非常棒的软件,它值得拥有专属自己的博文。我等下会写一篇。
  • Splat –“一个可以让代码跨平台的库。”它提供了图片和颜色的跨平台API,依靠特定平台的扩展方法在特定平台的本地类型之间转换。如果你遇到了这样一个问题,想在可移植视图模型下显示一个图片,那么无疑Splat是一个非常优质的解决方案。

接下来,是Scott LoveGrove自白:

我(Scott LoveGrove)此刻可能有点儿痴迷于PCLs。#我有一个问题(链接

所以Scott(Scott LoveGrove)已经发布了四个用于访问web services的可移植类库:

  • Scoreoid Portable – 一个让开发人员用于访问Scoreoid scoring系统的可移植类库。这个库为Scoreoid Rest APIs提供了一个友好的.Net包装器,并且使用了我们的可移植 HttpClient NuGet包。
  • FanArt Portable – 一个开发人员可以用于访问fanart.tv 电影,TV和音乐图片资源的可移植类库。它也使用了可移植HttpClient包。
  • Cineworld Portable – 一个开发人员可以用于访问Cineworld影片和浏览电影篇目的可移植类库,只用于英国和爱尔兰。它也使用了可移植HttpClient包。
  • LiveSDKHelper – 一个帮助类库,让微软Live SDK的使用变得更加容易。它包含了那些能够被反序列化的Live SDK响应的强类型。

另外一个新发布的可移植类库是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 phoneIOS 和安卓的跨平台应用程序。它使用可移植类库,用于共享平台之间的通用代码,用到了从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成为一个非常有趣的开发平台工具。

.Net 跨平台可移植类库正在进行的更多相关文章

  1. .Net 跨平台可移植类库PCL可用于任何平台包括Mono

    Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...

  2. Mono 3.0.12 支持可移植类库

    Mono 3.0.12已于6月19日发布.对跨平台开发者而言,对可移植类库的支持可能是该版本最重要的变化.该技术可以使一个DLL支持.NET.Windows Store.Windows Phone.S ...

  3. VS2015中SharedProject与可移植类库(PCL)项目

    转自:http://www.tuicool.com/articles/beaMZv3 今天闲里偷空看了点Connect大会的视频,C# 6.0的新语法.EF7的支持非关系型数据库.Windows商店应 ...

  4. Android的项目不能直接引用可移植类库的项目解决方法

    深圳_exception() 10:25:51 Android的项目不能直接引用可移植类库的项目,但是可以引用可移植类库生成的dll,这就意味着无法直接断电调试可移植类库上海-黄药师() 10:26: ...

  5. 使用 Portable Class Library(可移植类库)开发 Universal Windows App

    今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...

  6. .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)

    .Net Core跨平台应用研究-CustomSerialPort -增强型跨平台串口类库 摘要 在使用SerialPort进行串口协议解析过程中,经常遇到接收单帧协议数据串口接收事件多次触发,协议解 ...

  7. 可移植类库无法使用async、await关键字

    今天遇到了如题所示的问题,平台已经选择了.net 4.5了,可是就是编译不通过,await关键字下出现了红色下划线. 解决方法:安装一个Bcl的补丁包. https://www.nuget.org/p ...

  8. Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...

  9. C++开源跨平台类库集

    在如下的库支持下,开发的系统可以很方便移植到当前大部分平台上运行而无需改动,只需在对应的平台下 用你喜欢的编译器 重新编译即可 经典的C++库   STLport-------SGI STL库的跨平台 ...

随机推荐

  1. Python +crontab定时备份目录发送邮件

    公司有一台静态页面展示服务器仅供给客户展示我们做的项目,当时买的时候是最低配,也就是磁盘空间为20G的系统盘,考虑到代码量很小所以没有另加磁盘,后来项目多了,就写了个crontab 定时备份目录. 就 ...

  2. 用 Blend 给Windows Phone 应用创建 示例数据

    前言  创建 示例数据(Sample Data) 是提高程序开发效率的一个很有效方法,有了它,我们调UI的时候就不必每次都运行应用,然后在手机上观看页面效果了,配合 “AlignmentGrid.pn ...

  3. UWP学习记录3-设计和UI之样式

    UWP学习记录3-设计和UI之样式 1.颜色 在系统的“设置”>“个性化”>“颜色”里,提供了主题色选择.选定主题色后,会根据颜色亮度的 HSB 值创建浅色和深色的主题色. 应用可使用阴影 ...

  4. tomcat实现域名访问步骤

    1.找到tomcat的主目录,进入conf文件夹,找到server.xml文件,并打开: 2.修改tomcat的监听端口为80端口: 3.将内容中的 localhost 替换成你想修改的IP地址或者域 ...

  5. 使用Mysql 5.5数据库Hibernate自动建表创建表出错table doesn't exist

    在mysql 5.0版本以后不支持 type=InnoDB 关键字,需要使用 engine=InnoDB 配置文件方言改成如下即可 <property name="dialect&qu ...

  6. Python爬虫学习(8):浙大软院网络登陆保持

    在浏览器的验证窗口中输入登陆名和密码后,成功后会弹出一个小的新窗口,如果不小心关闭了这个窗口,则就会无法联网.如果说我在一个不带有桌面的Linux系统中,我是不能够通过浏览器接入网络的,虽然提供了不同 ...

  7. 德国W家HIPP 奶粉有货播报:2014.6.25 HIPP 1+ 4盒装有货啦!

    德国W家HIPP 奶粉有货播报:2014.6.25 HIPP 1+ 4盒装有货啦!

  8. js学习笔记之标准库

    在全局函数中,this等于window  在函数被作为某个对象的方法调用时,this等于那个对象. 数组的函数: 检测:Array.isArray() 转换:toString(),toLocalStr ...

  9. iOS XMPP 通信协议实现 图形化直观感受

    第一次随笔,实在不知写点什么有用的东西,那就分享一下本人最近的研究所得吧! 是关于iOS-XMPP-通信协议的实现,具体代码比较复杂,三言两句也实在难表达清楚,网上已有很多关于iOS XMPP协议的讲 ...

  10. Linux Shell 编程中的特殊符号

    一.井号 # 1.在脚本文件中对一行进行注释. 2.在引号和\符号后不是注释,只是#号本身: echo "12 # hehe" echo '12 # hehe' echo 12 \ ...