早在2000年6月,微软公布.NET之后不久,Ximian公司诞生了一个开源项目叫做Mono,运行在Linux环境下面的C#编译器和.NET Framework。十年后,在2011年,Ximian的创立者成立了Xamarin,仍然致力于开源版本的Mono,此时Mono已经适应了移动设备的跨平台。
针对多个不同的平台使用一种编程语言的优点在于可以共享应用程序之间的代码。
在开发程序之前,我们就要考虑好代码的共享问题。自从图形界面的应用大行其道,程序员开始认识到将逻辑代码从界面中分离出来,放到单独的层中有多么重要。也许最有效的分层方法是:数据层、业务逻辑层、用户界面。当下流行的MVC(模型-视图-控制器)应用程序体系结构将代码分离到模型(数据基础)、视图(数据的可视化表示)以及控制器(处理用户的输入)中。
MVC模式起源于20世纪80年代,最近,基于现代图形用户界面的MVVM模式比MVC更加灵活和有效。MVVM模式将代码分离到模型(基础数据)、视图(用户接口,包括可视化和输入)和视图模型(负责管理模型和视图直接的数据传递)。
当程序员开发一个款跨越多个移动平台的应用,MVVM架构模式可以引导开发者将代码划分为平台相关的视图(需要和平台API交互的代码)和平台无关的模型、视图模型。
通常平台无关的代码包括像文件访问、网络访问、使用集合或者线程的这类操作。很多时候,这些工作会被集成到操作系统API的当中,或者也可以通过.NET类库进行调用。如果.NET可以在每一种平台中进行调用,那么这些代码就不会对平台产生依赖。
在程序中,平台无关的那一部分通常被放到一个单独的项目中。这个项目可以是一个SAP(Shared Asset Project,包含一些可以被其他项目所访问的代码和资源文件),也可以是一个PCL(Portable Class Library,可移植类库,将公共代码封装到一个DLL中,给其他项目调用)。
不管使用的是哪一种方法,公共代码都能够访问.NET类库,所以它能够处理文件的输入/输出、访问Web服务、解析XML等等。
我们可以创建一个VS解决方案,包含四个项目,一个公共类库和针对3个主流平台的C#项目。或者可以使用Xamarin Studio创建只针对某一个平台的项目。
下图展示了Visual Studio或者Xamarin Studio项目、Xamarin 类库和平台API之间的关系。第三列指的是基于.NET的Windows平台,而不管使用的是何种设备。
图中的第二行指的是特定平台下的实际应用程序。应用程序去调用公共的类库项目(PLC、SAP)和实现了本地平台API的Xamarin类库。
但上图描述的内容还不够全面,它并没有显示出PLC或SAP怎样调用.NET类库。公共代码究竟依赖于哪一个版本的.NET:一个PLC类库可以访问它自身的.NET版本,然而SAP所使用的.NET版本取决于特定的平台。
图中的Xamarin.iOS和Xamarin.Android看上去非常重要,但是它们大多只是语言绑定,并没有显著真加对API调用的开销。
当我们生成一个ISO应用程序的时候,Xamarin C#编译器通常会先生成C#中间语言,然后它会利用MAC上的苹果编译器去生成原生的ISO机器代码,就如同Object-C编译器一样。即使应用程序是使用的Object-C开发,应用程序调用ISO的API方式都是一样的。
对于Android应用程序,Xamarin C#编译器生成中间语言,然后运行在一个版本的Mono设备上面,这个设备同时也安装了Java引擎。这个应用程序的API调用基本上和Java写的程序几乎一样。
如果移动应用程序有非常依赖于具体平台的需求,还共享一个平台相关的代码块,Xamarin.iOS和Xamarin.Android有一个优秀的解决方案,你可以访问平台所有的API。
但是对于不需要这么多平台特异性的应用程序,有更加简化的替代方法。