1. Xamarin开发入门

移动应用开发主要在两个产品之间共享:苹果的iOS和谷歌的Android。iOS的本机开发是使用编程语言Objective-C或Swift、Cocoa和Cocoa Touch框架完成的。Cocoa是苹果API的名称。在为Android开发时,可以使用谷歌的Android SDK,而Java是主要编程语言。

可以使用C#和XAML,而不是使用不同的编程语言重写代码。Xamarin提供跨平台开发,但仍然可以使用本机API。

由于Xamarin被微软收购,并且Visual Studio中的Xamarin工具集成越来越好,因此许多使用跨平台技术的应用程序可以提高生产率。

本章介绍如何开始创建Xamarin应用程序。使用从其他章节学到的有关C#、.NET Core和XAML的基础,在阅读本章后,就可以使用Xamarin开发开始应用程序了。其他专门讨论Xamarin的书中还有很多这方面的内容,这是一个好的开始。

注意:

要创建和编译本章中的示例,需要在Windows 系统上安装Mobile Development with .NET 工作负载。另一个选项是,可以使用Visual Studio for Mac。拥有Android手机有助于运行Android应用程序。要创建和编译iOS示例,需要使用Mac进行编译,而iPhone也很有用。

1. 用Android架构Xamarin

为Android手机创建Xamarin应用程序时,知道幕后发生了什么是很不错的。下图给出了一个架构概括。Android在Linux内核上运行。在Google中可以看到,Android SDK在Android运行库(ART)之上运行。该图的左侧显示了.NET部分——使用.NET Mono运行库的.NET API。Mono运行库和ART在应用程序进程中并行运行。Mono Callable Wrapper(MCW)用于从.NE中调用Android SDK。反过来也是可能的:为了从Android进入.NET,可使用Android Callable Wrapper(ACW)。用户过去可能使用过.NET与COM(来自Microsofte的组件对象模型)。在这里,该体系结构与Runtime Callable Wrapper(RCW)和COM Callable Wrapper(CCW)非得相似。为了便于从.NET进入Android SDK,Xamarin创建了Android Binding。

1. Xamarin开发入门

如果想从.NET中调用Android SDK,则可以创建MCW。

Xamarin.Android使Android中的Java API可用于.NET,而且它非常庞大。这些API可以在https://developer.xamarin.com/api/root/MonoAndroid-lib/上找到。这里只提及几个重要的名称空间:Android.App名称空间带有Activity类和用于长时间运行的后台操作的Service类,以及带UI元素的Android.Widget名称空间。

Xamarin网站上的文档遗漏了很多可以直接在https://developer.android.com/reference/packages.html上阅读的信息。在映射类型时,来自https://developer.android.com的信息比较适用。

2. 用iOS架构Xamarin

iOS上Xamarin应用程序的体系结构是不同的。由于iOS上的安全限制,不允许在设备上执行动态生成的代码。这就是为什么Xamarin使用提前(AOT)编译器将从C#编译器创建的IL代码编译为本机代码的原因。这提供了很好的运行性能和更好的启动时间,但它也有一些限制。C#将泛型编译为泛型IL类型。使用泛型类型和即时(JIT)编译器,当IL代码在运行期间被编译时,会解析泛型。使用ADO编译器,IL代码需要在部署到设备上之前进行编译。所以泛型不能用于某些场景。例如,不能在派生自NSObject的类中创建泛型方法。泛型也不能用于P/Invoke。对于Xamarin.iOS,P/Invoke用于使用C#定义方法,但它使用Objective-C中的实现。而且,反射是有限的。不能用反射发射代码,动态生成的代码是不允许的。由于IL代码已经预编译,Mono iOS Rntime中的更多功能被禁用,例如元数据验证程序和JIT引擎。

下图给出了Xamarin的iOS体系结构的概括图。iOS使用类似于Unix的内核,Objective-C运行库和iOS  API在其顶部。.NET API绑定到iOS Api,以提供相同的功能,并使用AOT编译器和删减版的Mono运行库。

1. Xamarin开发入门

https://developer.xamarin.com/api/root/ios-unified/上可以找到Xamarin.iOS的文档。Xamarin for iOS提供了许多SDK。用户界面的主要部分是UIKit名称空间。Apple的信息可以在https://developer.apple.com/documentation/uikit中找到。

幸运的是,可以使用C#和XAML为这些平台开发。Xamarin提供跨平台的开发,但它仍然使用平台的所有功能。

注意:

为什么用户界面的iOS类具有UI前缀。原因是Objective-C(用于实现本机iOS应用程序的编程语言)不支持名称空间。为了避免与其他类的冲突,用户界面的类具有UI前缀,而来自其他区域的类具有其他前缀。Xamarin.iOS.Contacts名称空间中的类具有前缀CN,例如CNContact。

注意:

Xamarin.iOS(经典)与Xamarin.iOS不同,它也编辑为"统一"。Xamarin.iOS(经典)仅适用于iPhone,而更新版本的Xamarin.iOS为iPhone、iPad和Mac使用统一的API。经典的API也仅限于32位,不再能在App Store中使用。

3. Xamarin.Forms

有了Xamarin,可以使用Xamarin.Android创建Android应用程序,使用Xamarin.iOS创建iOS应用程序,或者使用Xamarin.Forms创建适用于Android、iOS、Windows和更多平台的应用程序。

有了Xamarin.Android,就可以使用完整的API和Android SDK的所有控件。借助Xamarin.iOS,可以看到可从C#中访问的所有iOS SDK。使用Xamarin.Android或Xamarin.iOS,可以创建单独的用户界面并使用平台特定的代码,但可以共享业务逻辑和服务。

使用Xamain.Forms,可以共享用户界面代码,还可以使用XAML代码创建用户界面。但是,与使用矢量图形绘制元素的UWP相反,Xamarin.Forms使用每个平台的本机控件呈现用户界面。

使用本机控件具有很大的优势,因为可以获得每个平台本机控件的外观和性能。不过,本机控件也有一个缺点。使用Xamarin.Forms,只能获得可映射到每个平台的控件,得不到仅在Android或iOS上可用的控件。可以实现一个自定义的特定于平台的渲染器,以使用不能直接从Xamarin.Forms*问的、平台特定的控件或特征。

注意:

还记得Windows 窗体吗?Windows 窗体是本机Windows控件的一个包装器。也许选择Xamarin.Forms这个名字是因为它也是本机控件的包装器。Xamarin.Forms包装了iOS、Android和Windows上的本机控件。