.Net 跨平台可移植类库正在进行
[原文发表地址] 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 小组:
- HttpClient– 一个简化的API,用于与HTTP服务通话,公布于此。
- Microsoft.Bcl.Compression - GZIP, DEFLATE & ZIP compression压缩,使得Http变得很有效。
- Microsoft.Bcl.Async – 准备好了底层平台的等待/异步。
- Microsoft Composition 的MEF 2。
- TPL Dataflow(Actor/Agent-based API,用于协调异步管道),依赖于作为Microsoft.Tpl.Dataflow的NuGet,公布于此。
- Microsoft.Bcl.Immutable中的Immutable Collections,公布于此。
其他小组:
Azure Mobile Services 有一个可移植类库。
- Rx Extensions
更不用说那些你已经很熟悉的优秀可移植类库。
MVVM
- MVVM Light Toolkit portable fork
- MvvmCross
- UpdateControls
IoC
- Autofac
- Ninject portable fork
- PortableIoC
- XplatUtils(IoC and Messager)
其他
当然了,我最爱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成为一个非常有趣的开发平台工具。
.Net 跨平台可移植类库正在进行的更多相关文章
- .Net 跨平台可移植类库PCL可用于任何平台包括Mono
Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...
- Mono 3.0.12 支持可移植类库
Mono 3.0.12已于6月19日发布.对跨平台开发者而言,对可移植类库的支持可能是该版本最重要的变化.该技术可以使一个DLL支持.NET.Windows Store.Windows Phone.S ...
- VS2015中SharedProject与可移植类库(PCL)项目
转自:http://www.tuicool.com/articles/beaMZv3 今天闲里偷空看了点Connect大会的视频,C# 6.0的新语法.EF7的支持非关系型数据库.Windows商店应 ...
- Android的项目不能直接引用可移植类库的项目解决方法
深圳_exception() 10:25:51 Android的项目不能直接引用可移植类库的项目,但是可以引用可移植类库生成的dll,这就意味着无法直接断电调试可移植类库上海-黄药师() 10:26: ...
- 使用 Portable Class Library(可移植类库)开发 Universal Windows App
今天在这里跟大家聊聊关于 Windows Universal 应用夸平台的问题,首先Universal Windows App的定义相信大家已经有所了解了(如果你是一个刚刚接触 Universal A ...
- .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)
.Net Core跨平台应用研究-CustomSerialPort -增强型跨平台串口类库 摘要 在使用SerialPort进行串口协议解析过程中,经常遇到接收单帧协议数据串口接收事件多次触发,协议解 ...
- 可移植类库无法使用async、await关键字
今天遇到了如题所示的问题,平台已经选择了.net 4.5了,可是就是编译不通过,await关键字下出现了红色下划线. 解决方法:安装一个Bcl的补丁包. https://www.nuget.org/p ...
- Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...
- C++开源跨平台类库集
在如下的库支持下,开发的系统可以很方便移植到当前大部分平台上运行而无需改动,只需在对应的平台下 用你喜欢的编译器 重新编译即可 经典的C++库 STLport-------SGI STL库的跨平台 ...
随机推荐
- 与你相遇好幸运,使用redis设置定时任务
参考链接: Nodejs中使用Redis来完成定时任务 自己在 window 7下编码实现: 1 > 首先查看redis版本: redis-server -v , 版本要求大于等于2.8 2&g ...
- EF不能很好的支持DDD?估计是我们搞错了!
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在ABP项目中尝试纯粹的DDD,然后遇到EF实现的Repository似乎不能很好 ...
- 基本术语表【WF】
术语 定义 activity(活动) Windows Workflow Foundation 中的程序行为单元. 可将单个活动组合在一起,形成更复杂的活动. activity action(活动操作) ...
- OpenMesh 将默认的 float 类型改为 double 类型
OpenMesh 中默认的数据类型都是 float 类型的,如果要将其默认的 float 类型改为 double 类型,可以这么做: #include <OpenMesh/Core/Mesh/P ...
- 「理解HTTP」之常见的状态码segmentfault
状态码的职责是当客户端向服务器端发送请求时,描述返回请求结果.借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了什么错误. RFC2616定义的状态码,由3位数字和原因短信组成.数字中的第一 ...
- 设置CentOS不启用图形界面
由于linux服务器放在机房长时间运行,或者只是在后台运行,一般通过secureCRT连接服务器: 所以在虚拟机上都不需要图形界面,而且图形界面占用内存. 所以,我们可以通过简单的设置,让linux只 ...
- 使用ZwMapViewOfSection创建内存映射文件总结
标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...
- Swift String类型常规操作
去除string 首尾的空格var str = " Hello the world "let whitespace = NSCharacterSet.whitespaceAnd ...
- CSS3简单的栅格系统
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- fullPage.js学习笔记
中秋节,一个人呆着,挺无聊的,还是学习最有趣,不论是什么,开阔视野都是好的. 参考网址:http://www.dowebok.com/77.html 上面有详细介绍及案例展示,很不错哦,可以先去看看 ...