.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库的跨平台 ...
随机推荐
- 什么是BOM头,BOM头有什么影响,怎么去掉BOM头
什么是bom头? 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也 ...
- CSS清除浮动技巧
一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 本来两个黑色对象盒子是在红色盒子内,因为对两个黑色盒子使用了f ...
- 怎样用conda安装opencv
首先用Anaconda是因为方便(管理方便,包安装真心不方便).下面是我的安装过程: 首先使用如下命令安装opencv conda install -c https://conda.binstar.o ...
- POJ 3009 Curling 2.0【带回溯DFS】
POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...
- cout输出控制——位数和精度控制
刷到一道需要控制输出精度和位数的题目 刚开始以为单纯使用 iomanip 函数库里的 setprecision 就可以,但 OJ 给我判了答案错误,后来一想这样输出并不能限制位数只能限制有效位数. 比 ...
- D3中selection之使用
1. 极为重要的reference: [1] How selections works. http://bost.ocks.org/mike/selection/ [2] Nested selecti ...
- nodejs复习04
TCP/UDP网络应用 创建TCP服务器客户端 socket套接字对象实例,是对TCP协议的一个基本封装接口 clientt套接字对象实例 //server.js var net = require( ...
- 安卓智能POS终端手持机PDA应用仓库出入库,移库,盘点,销售开单系统
随着移动互联网的兴起,目前仓储管理所面临的的问题可以迎刃而解,WMS仓库系统解决方案通过智能终端扫描条码技术应用解决了工作量大导致工作效率不高,以及数据实时传输等问题,该方案主要提供仓库出入库,移库, ...
- asp.net(C#)读取文件夹和子文件夹下所有文件,绑定到GRIDVIEW并排序 .
Asp部分: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyFiles ...
- 【HTTP】模拟form提交表单(转)
第一种:WebClient string postString = "arg1=a&arg2=b";//这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是for ...