Xamarin — 是微软于2011年发布的用于在C#语言中创建移动应用程序的平台。根据 Microsoft Xamarin Documentation, 2024,Xamarin允许使用C#和.NET的通用代码库为iOS、Android和Windows编写应用程序,并使用Mono Runtime编译为本机代码。自2024年起,Xamarin.Forms已被.NET MAUI取代。
要点
Xamarin — 是一个基于.NET和Mono的平台,允许使用C#创建跨平台移动应用程序。Xamarin公司成立于2011年,于2016年被微软以4亿美元收购。收购后,Xamarin成为Visual Studio和Azure生态系统的一部分。
在被微软收购之前,Xamarin 是一个拥有企业许可证的商业产品。微软将其作为Visual Studio Community的一部分免费提供,并开放了Mono Runtime和SDK绑定的源代码。这导致其受欢迎程度上升:根据SlashData的报告,到2020年,Xamarin被用于15%的跨平台项目中。
Xamarin 的主要理念 — 将代码分为三层:通用业务逻辑(C#、.NET Standard)、平台项目(iOS、Android)和通过Xamarin.Forms的可选共享UI。这种方法允许在保持对每个平台API的本机访问的同时重用高达75%的代码。
Xamarin 1.0 的第一个版本于2012年发布,仅支持iOS。2013年增加了对Android的支持。Xamarin.Forms — 声明性UI框架 — 于2014年在Evolve大会上推出。Xamarin 4.0(2016)增加了对watchOS和tvOS的支持。Xamarin 5.0(2019)引入了CSS样式和Material Design主题。
Xamarin.Forms 5.0 的最后一个主要版本于2021年发布。微软宣布Xamarin将进入支持模式(生命周期结束 — 2024年5月1日),并建议迁移到属于.NET 6+一部分的.NET MAUI(多平台应用程序UI)。Xamarin.Forms 5.0不再获得新功能,只获得关键安全修复。
Xamarin.Forms — 是一个通过统一元素集抽象接口的UI框架。XAML标记(ContentPage、StackLayout、Label、Button)通过渲染器映射到每个平台的本机控件。Label在iOS上转换为UILabel,在Android上转换为TextView。这种方法提供高达95%的共享UI代码。
Xamarin.Native(也包括Xamarin.iOS和Xamarin.Android)— 是一种没有共享UI的方法。开发人员使用一个C#后端为iOS(Interface Builder或Storyboard)和Android(AXML)创建单独的屏幕。这样可以完全控制每个平台的外观,但会将重复的UI代码量增加到50–60%。
根据 Microsoft Developer Survey 2023,70%的Xamarin项目使用Xamarin.Forms,20%使用带有共享服务的Xamarin.Native,10%使用带有用于平台优化的自定义渲染器的混合方法。
Xamarin架构 由两层组成。底层 — Mono Runtime,在平台上执行C#中间语言(IL)。上层 — 用于iOS的托管可调用包装器(MCW)和用于Android的Android绑定,它们提供从托管C#代码对本机API的访问。
Mono — 是.NET框架的开源实现。在Xamarin中,Mono作为公共语言运行时(CLR)执行环境工作,加载C#程序集并将其编译为机器码。在iOS上,Mono进行提前编译(AOT)— 编译为ARM64机器码,因为Apple禁止在用户应用程序中进行JIT编译。在Android上,Mono使用带有AOT分析的JIT编译。
iOS绑定(Xamarin.iOS)— 是Objective-C运行时之上的C#包装器。每个UIKit类(UIView、UIViewController)由Xamarin.iOS.dll程序集中的托管类表示。Objective-C选择器通过MessageUI机制调用。在Android上,Xamarin.Android使用Android可调用包装器(ACW)— C#与Java/Kotlin之间的JNI桥接。Kotlin库通过Android绑定库进行包装。
XAML(可扩展应用程序标记语言)— 用于描述UI的声明性语言。在Xamarin.Forms中,XAML定义屏幕结构:页面(ContentPage)、容器(StackLayout、Grid、FlexLayout)和元素(Label、Entry、Button、ListView)。C#中的后端代码处理事件(Clicked、PropertyChanged)并管理数据绑定(Binding、Data Binding)。
MVVM模式 — Xamarin.Forms的推荐架构。模型包含数据,视图模型实现INotifyPropertyChanged和命令(ICommand),视图(XAML)通过BindingContext连接。通过RelayCommand或Prism DelegateCommand实现ICommand可确保在没有UI依赖的情况下测试视图模型。Prism.Forms库提供NavigationService、DialogService和模块化。
using Xamarin.Forms;
namespace XamarinApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
var label = new Label
{
Text = "Hello, Xamarin!",
FontSize = 24,
VerticalOptions = LayoutOptions.Center,
HorizontalOptions = LayoutOptions.Center
};
Content = new StackLayout
{
Children = { label }
};
}
}
}
单一C#语言 — Xamarin的主要优势。C#和.NET开发人员无需学习Swift、Kotlin或Objective-C即可创建移动应用程序。业务逻辑、网络工作、数据库(通过ORM的SQLite)、加密和日志记录一次性编写并在所有平台上重用。这简化了代码的维护和测试。
对本机API的访问 — Xamarin通过绑定提供对iOS(Cocoa Touch)和Android(Android SDK)API的100%访问。当新的iOS或Android版本发布时,微软在24–48小时内发布更新的绑定。对于缺失的绑定(自定义Objective-C或Kotlin库),手动创建Android绑定库或iOS绑定库。
与微软生态系统集成 — Xamarin支持Visual Studio、Azure DevOps、App Center(CI/CD、测试、监控)和企业移动性+安全性(Intune、ADAL、MSAL)。App Center分析和崩溃从实时应用程序收集数据。Visual Studio App Center自动化构建、设备测试和应用程序商店发布。
缺点 — Xamarin的缺点包括应用程序大小 — 带有空白屏幕的Xamarin.Forms APK重25–35 MB,而本机Android应用程序为5–8 MB。编译时间也更高:中等规模的项目构建需要2–5分钟,而本机Android Studio需要30–60秒。Mono Runtime向最终二进制文件添加15–20 MB。
第二个缺点 — 新API的延迟。新的iOS/Android功能在本机开发中立即出现,但在Xamarin中 — 在绑定发布后1–2个月。iOS 17 SDK(2023)在发布后3周内得到Xamarin的完全支持。对于紧急项目,这可能是关键的。.NET MAUI通过与.NET 8的直接集成解决了这个问题。
| 标准 | Xamarin | .NET MAUI |
|---|---|---|
| 平台 | iOS、Android、Windows | iOS、Android、Windows、macOS、Tizen |
| 基础框架 | Mono + .NET Standard | .NET 6+(统一BCL) |
| UI框架 | Xamarin.Forms | .NET MAUI(继任者) |
| 支持模式 | 自2024年5月1日起生命周期结束 | 微软积极开发 |
| 热重载 | 有限 | XAML热重载 + C#重载 |
.NET MAUI(多平台应用程序UI)— 是Xamarin.Forms的演进,由微软于2022年与.NET 6一起发布。MAUI将iOS、Android、Windows和macOS整合到一个项目中,无需为每个平台单独创建项目。与Xamarin.Forms不同,MAUI使用.NET 6+ BCL,而不是Mono和.NET Standard。
微软提供 迁移工具 — 用于Visual Studio的.NET升级助手。它分析Xamarin.Forms项目,替换命名空间(Xamarin.Forms.* -> Microsoft.Maui.*),更新.csproj文件(SDK风格格式)并将Android和iOS设置迁移到单一配置。迁移后,项目可以使用.NET 8的所有新功能:本机AOT、用于安全性的CodeQL和改进的构建性能。
关键变化 — 单一项目。如果Xamarin.Forms需要3个单独的项目(iOS、Android、.NET Standard),.NET MAUI使用一个带有Platforms/iOS、Platforms/Android、Platforms/Windows和Platforms/MacCatalyst文件夹的项目。每个平台从共享代码编译,带有平台条件指令(#if ANDROID、#if IOS)。
对于 现有代码库,.NET MAUI提供与Xamarin.Forms 90%的向后兼容性。API兼容性涵盖ContentView、ContentPage、Shell、NavigationPage、DependencyService和MessagingCenter。主要更改影响到Device.StartTimer(替换为IDispatcher)、Platform API(移至Microsoft.Maui.ApplicationModel)和过时的渲染器(替换为Handlers)。
迁移 过程包括五个步骤。第一 — 将Xamarin.Forms更新到最新的5.0版本。第二 — 将.NET Standard 2.0替换为.NET 6或8。第三 — 运行升级助手以自动转换项目。第四 — 在Platforms文件夹中修复平台代码。第五 — 测试,特别是自定义渲染器和平台服务。
常见问题
Xamarin — 是微软用于在iOS、Android和Windows上进行C#开发的移动平台。它使用Mono Runtime编译共享代码,并提供两种方法:Xamarin.Forms(通过XAML统一UI)和Xamarin.Native(平台的本机屏幕)。自2024年起,Xamarin处于支持模式。
Xamarin 使用C#和.NET,通过本机控件(UIKit、View)渲染,但通过绑定。Flutter使用Dart和自己的渲染引擎(Impeller),不依赖本机UI组件。Flutter在所有平台上提供统一外观,而Xamarin提供每个操作系统的本机外观。Flutter由谷歌支持,拥有46%的市场份额,而Xamarin为15%。
不建议。微软已于2024年5月1日 停止了对Xamarin的支持。所有新项目应在.NET MAUI上启动 — 它的继任者,内置于.NET 8中,并将随.NET平台一起获得更新。对于现有的Xamarin.Forms项目,建议在12–18个月内进行迁移。
对于普通应用程序来说,差异 很小。Xamarin.Forms由于托管包装器-本机包装器而增加了5–10%的渲染开销。问题出现在繁重的列表(ListView与RecyclerView)和动画(使用Xamarin.Forms工具而没有平台API)中。建议使用CollectionView(已替换ListView)和本机动画。
可以,通过 Android绑定库。这种.NET项目类型将AAR或JAR存档包装到C#绑定中,并自动生成类和方法。对于Kotlin库,需要额外的协程和密封类处理程序,这些程序通过绑定库中的Metadata.xml进行配置。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。