Xamarin跨平台开发中的File Link 和 Portable Class Library的应用

最近因为项目的原因,开始接触Xamarin这个跨平台解决方案。

这里对Xamarin就不做详细说明,主要说说逻辑代码共享的问题。

对于与数据库打交道的人来说,DataSet这个对象是经常用到的。但是在Xamarin解决方案下,尽管IOS,Android和.Net Framework平台下都有DataSet对象,但是需要引用的DLL却不同。

.Net Framework 的 DataSet 引用了  %Program Files(X86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\目录下的System.Data.dll。

Xamarin.IOS 引用了  %Program Files(X86)%\Reference Assemblies\Microsoft\Framework\Xamarin.iOS\v1.0\ 目录下的System.Data.dll。

Xamarin.Android 引用了 %Program Files(X86)%\Reference Assemblies\Microsoft\Framework\MonoAndroid\v1.0\ 目录下的 System.Data.dll 。


因为要共用一套逻辑代码,一开始想采用Portable Class Library的方式,但是发现不可行,折腾了很长时间,最后才从网上找到了File Link 的方式。顺便对这两种方式做了一下对比。

先看看PCL(Portable Class Library)方式,这是一种可移植库的共享代码方式,之前用于在windows、windows phone与Silverlight中共享代码,Xamarin在去年也引入了对PCL的支持。但是PCL并不是万能的,PCL依赖于.Net Core的支持,也就是PCL只能够引用以.Net Core为基础的DLL。诸如System.data这类的DLL并不能再PCL项目中因引用。

其实很多一开始接触.NET的人可能都像我一样,以为.Net Framework是一个跨平台的开发框架,只不过.net编译器没有在其他操作系统上有很好的实现。但是这段时间对.Net Framework做了深入了解之后才发现。其实.Net Framework中许多的实现都是与操作系统相关,脱离windows平台,.Net Framework库中许多的功能实际是无法实现的,因为不同操作系统对于编译器的接口和功能实现都是不一样的。

后来由于开源运动的兴起,微软开始引入了.Net Core项目,即.net 核心类库,并于2014年11月开源了.Net Core的代码并托管于GitHub上。.Net Core核心库并不是.Net Framework的子集,而更像是.Net Framework的基础库,是父子的关系。并且.Net Core去除了与操作系统强相关性的类库。在.Net Core基础之上,在windows平台上实现了.Net Framework,而Mono项目组则分别在Linux和移动平台(IOS、Android)上实现了Mono.Net和Xamarin(在刚结束的MS Build 2015上,.Net Core完成对了MAC OS的支持)。

也就是说,目前主流的几大.NET开发框架,实际都是基于.Net Core核心类库,这也就是.Net Core能够跨平台的原因。而对于.Net Core之外的功能,则由各个开发商针对不同的平台进行特殊开发,这些特殊开发的类库在不同平台之间就存在兼容性的问题。


那再说说File Link,其实很简单,就是文件链接。在多个项目中引用同一个.cs文件。这样在代码发生修改时,各个项目之间代码能够保持统一。

那么File Link是怎么实现跨平台共用的?这里有一个前提条件,就是在不同平台的项目中,代码中所涉及的引用、实现必须完全相同,才能采用File Link的方式进行共享。

Xamarin中的DataSet为例,虽然3个平台的具体实现有所不同,但是DataSet的命名空间首先是相同的,保证在using的地方引用空间的名字相同。其次是所涉及的DataSet的方法、参数也是相同的。这样在不同平台的项目中,尽管引用不同,但是代码中并不会发生语法或编译错误。


那么对于File Link 和Portable Class Library两种方式在开发中的应用就显而易见了。首先跨平台开发前应该对功能代码有很好的划分,像MPV、MVVM这类的开发架构非常重要,除了对UI和Model进行隔离之外,对平台相关与非平台相关的代码也要有很好的规划,这是很考验一个程序员的系统分析能力。

然后,对于Xamarin这种解决方案而已,一般需要将模块分为4类。UI或者是MVVM模式中的View和View Model划归为单独的一类。因为这里UI中涉及的代码,Xamarin采用的是与原生平台语法相同或接近的写法,所以这一部分的代码是不能够共用的。不过在Xamarin 3.0中引入的Xamarin.Form这个跨平台的UI开发框架,只是这点我还没有研究过,暂不讨论了。

第二类就是基于.Net Core开发的模块,这类代码完全可以做成独立的项目,即使是项目编译出来的DLL也能够在其他平台项目中正常的引用和编译。所以这里需要对.Net Core核心库提供的功能有充分的掌握,以保证尽可能多的模块能够移植,降低开发的成本。

第三类,也就是最考验开发者对框架熟悉程度的,就是采用File Link编写的模块。这块代码中所使用到的类必须保证在各个平台之间的功能实现都是完全相同的,否则即便是编译能够通过,也有可能因为参数或返回值的不同,照成代码在实际运行中发生不可预知的错误。这块代码在开发时需要非常耐心的对待,测试的时候也需要对每个平台、每个方法做逐一的测试。

第四类,也就是与平台相关的逻辑代码,这块代码完全是针对不同平台开发的,一般也就作为一些扩展功能和功能增强的代码。

所以就整体而言,File Link 和 Portable Class Library的灵活运用是能够达到一定程度上的代码共用,这个对于跨平台开发的能够节约不少的工作量,也利于代码的维护和升级。

而且随着.Net Core 及 编译器的开源,越来越多的开源开发者开始丰富.Net Core的核心类库,并且微软也在向这一方面努力。自.Net Core开源以来,目前已经超过了1000个分支项目,而微软目前在.Net Core上只完成了对.Net Framework类库中越25%的代码迁移。相信以后会有越来越多的跨平台类库可供选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值