.NET MAUI — 是微软的跨平台框架,用于在 C# 和 XAML 中创建原生应用程序,于 2022 年随 .NET 6 发布。根据 Microsoft .NET MAUI Documentation, 2024,MAUI 支持 iOS、Android、Windows、macOS 和 Tizen,将它们统一到一个具有共享代码库的单一项目中。该框架是 Xamarin.Forms 的直接继承者。
要点
.NET MAUI(Multi-platform App UI)— 是 Xamarin.Forms 的演进,为 .NET 6+ 从头重新设计。与需要为每个平台单独项目的 Xamarin.Forms 不同,MAUI 使用统一的结构,包含共享的 .csproj 文件和平台文件夹 Platforms/iOS、Platforms/Android、Platforms/Windows 和 Platforms/MacCatalyst。MAUI 的第一个稳定版本于 2022 年 5 月发布。
.NET MAUI 与其前身的关键区别 — 与 .NET 8 BCL(基类库)完全集成。开发人员可以直接访问 System.Text.Json、System.Net.Http、System.Linq、System.IO 和其他 API,无需额外的 SDK。Xamarin.Forms 使用 .NET Standard 2.0 作为共享逻辑,这限制了对 .NET 平台新功能的访问。
根据 Microsoft Build 2024,.NET MAUI 在 App Store 和 Google Play 中被用于 40,000+ 个应用程序中。知名项目包括 UPS Mobile、The Weather Channel 和 Siemens Teamcenter。微软正在 .NET 9 框架内积极开发 MAUI。
.NET MAUI 在 Microsoft Build 2020 上宣布,作为 .NET 统一战略的一部分。微软将 .NET Core、Mono 和 .NET Framework 统一为一个 .NET 5+ 平台。Xamarin.Forms 成为 MAUI 的基础,但代码库被完全重写:过时的 API 被删除,渲染器被 Handlers 取代,DependencyService 被 DI 容器取代。
.NET MAUI 8 版本(2023 年 11 月)增加了对 Native AOT 的支持、改进的 CollectionView 性能、Blazor Hybrid(将 Blazor 组件嵌入 MAUI 应用程序)和新的字体映射。.NET MAUI 9(2024)包括对 C# 12 的支持、与 WinUI 3 和 macOS Sonoma 的改进集成,以及适用于所有平台的新 Drag & Drop API。
第一个区别 — 单一应用程序。在 Xamarin.Forms 中,iOS 和 Android 需要一个解决方案中的两个独立项目。在 .NET MAUI 中,一个项目包含平台文件夹。这简化了代码导航、依赖管理和 CI/CD 管道。.csproj 文件使用 SDK 风格格式,包含 TargetFrameworks:net8.0-android、net8.0-ios、net8.0-maccatalyst。
第二个区别 — 渲染架构,通过 Handlers 而不是渲染器。在 Xamarin.Forms 中,每个元素(Button、Label)都有自己的 Renderer 类,用于创建原生控件。自定义需要 Custom Renderer。在 MAUI 中,Handler 是一个轻量级对象,将抽象元素映射到原生控件,并支持 Property Mappers 来更新属性,而无需重新创建控件。
第三个区别 — 单一的 DI 容器 Microsoft.Extensions.DependencyInjection。Xamarin.Forms 使用 DependencyService 来注册平台实现。MAUI 将 DI 嵌入框架核心:服务在 MauiAppBuilder 中注册,控制器通过构造函数接收依赖项。这简化了测试并遵循现代 .NET 实践。
.NET MAUI 架构 基于多层模型。底层 — .NET BCL 和 Mono Runtime(Android)/ CoreCLR(Windows)/ NativeAOT(iOS)。中间层 — Microsoft.Maui.dll,包含框架核心:Handlers、Layout、Graphics、Controls。顶层 — 开发人员的应用程序,包含 XAML 页面、ViewModel 和服务。
Single Project — 是 .NET MAUI 的一个关键架构特性。所有文件分为三类:共享代码(Shared)、平台代码(Platforms)和资源(Resources)。.csproj 中的 multi-targeting 指定应用程序为哪些平台构建。每个平台只编译自己的 Platforms 文件夹和共享代码。
平台代码位于 条件文件夹中。Platforms/Android 包含 MainActivity.cs、MainApplication.cs 和 AndroidManifest.xml。Platforms/iOS — AppDelegate.cs、Info.plist 和 Entitlements.plist。Platforms/Windows — Package.appxmanifest 和 App.xaml。对于代码中的条件编译,使用 #if ANDROID、#if IOS、#if WINDOWS、#if MACCATALYST 指令。
XAML — 声明式标记语言,继承自 Xamarin.Forms 和 WPF。在 .NET MAUI 中,XAML 用于描述页面(ContentPage)、布局(VerticalStackLayout、Grid、FlexLayout)、元素(Label、Entry、Button、Image)和控件(CollectionView、CarouselView)。XAML 在构建阶段编译为 BAML 格式。
MVVM 模式 通过 CommunityToolkit.Mvvm 实现 — 微软的开源库。[ObservableProperty] 属性生成 INotifyPropertyChanged 属性,[RelayCommand] 从方法创建命令。Source Generator CommunityToolkit.Mvvm 8.2 转换 partial class ViewModel,生成 ObservableObject 而无需反射。与手动实现相比,这使 Binding 速度提高了 30%。
using Microsoft.Maui;
using Microsoft.Maui.Controls;
namespace MauiApp;
public class MainPage : ContentPage
{
public MainPage()
{
Title = "MAUI App";
Content = new VerticalStackLayout
{
Spacing = 12,
Padding = new Thickness(16),
Children =
{
new Label
{
Text = "Hello, .NET MAUI!",
FontSize = 24,
FontAttributes = FontAttributes.Bold
},
new Button
{
Text = "点我",
BackgroundColor = Colors.Blue,
TextColor = Colors.White,
Command = new Command(async () =>
await DisplayAlert("你好", "世界", "OK"))
}
}
};
}
}
.NET MAUI 支持 5 个平台:iOS 15.0+、Android 5.0(API 21)+、Windows 10 1809+、macOS 12.0+(MacCatalyst)和 Tizen 6.5+。每个平台使用自己的控件和 API 集。iOS 通过 Mac Catalyst 使用 UIKit,Android 通过 Xamarin.Android 使用 AndroidX,Windows 使用 WinUI 3,macOS 通过 Mac Catalyst 使用 AppKit。
在 iOS 和 Android 上,MAUI 使用与 Xamarin.Forms 相同的渲染机制 — 原生 UI 控件。然而,Handlers 提供了更灵活的自定义。对于 iOS 上 Button 的平台配置,使用带有 PlatformConfiguration.iOS 的 OnPlatform<Button>。对于 Windows,MAUI 使用 WinUI 3 — 微软的现代 UI 框架,支持 Fluent Design System。
macOS 支持通过 Mac Catalyst 添加 — 苹果的技术,在 Mac 上运行 UIKit 应用程序。这允许 100% 重用 iOS MAUI 代码用于 macOS 版本的应用程序。对于特定的 Mac 功能(Menu Bar、Touch Bar),MAUI 通过 Mac Catalyst 和 NSView 包装器提供平台 API。
Tizen — 三星的智能电视、智能手机和智能手表平台。.NET MAUI 中的 Tizen 支持通过 Samsung Tizen .NET 实现。MAUI 应用程序通过 Samsung TizenFX 绑定编译为 Tizen。然而,Tizen 不是微软的优先平台 — 其更新延迟 1-2 个月发布。
| 平台 | 最低版本 | UI 框架 | 状态 |
|---|---|---|---|
| iOS | iOS 15.0 | UIKit (Mac Catalyst) | 稳定 |
| Android | API 21 (5.0) | AndroidX / Material 3 | 稳定 |
| Windows | Win 10 1809 | WinUI 3 / Fluent Design | 稳定 |
| macOS | macOS 12.0 | AppKit (Mac Catalyst) | 稳定 |
| Tizen | Tizen 6.5 | TizenFX / Samsung | 附加 |
统一的代码库 — .NET MAUI 减少了代码重复量。一个 C# 和 XAML 项目编译为 5 个平台,为具有简单 UI 的应用程序提供高达 95% 的共享代码。业务逻辑、服务、数据模型和 HTTP 客户端位于共享代码中。只有平台功能(相机、地理位置、生物识别)需要通过 DI 进行单独实现。
性能 .NET MAUI 高于 Xamarin.Forms。Handlers 减少了渲染开销:微软的测试显示,与 Xamarin.Forms 5.0 相比,屏幕渲染时间减少了 20-30%。iOS 上的 Native AOT 将 C# 代码直接编译为 ARM64 指令,消除了 JIT 编译,并将启动时间减少了 40%。
Blazor Hybrid — .NET MAUI 的独特能力。BlazorWebView 将 Blazor 组件直接嵌入 MAUI 应用程序中。Web 界面开发人员可以在移动应用程序中重用 Blazor 组件(Razor 页面、JS-interop、CSS 样式)。Blazor Hybrid 在所有 5 个 MAUI 平台上运行,无需更改 Blazor 组件的代码。
.NET 生态系统 — 访问数千个 NuGet 包:Entity Framework Core 用于处理数据库,Serilog 用于日志记录,Polly 用于重复 HTTP 请求,FluentValidation 用于验证。CommunityToolkit.Maui 提供现成的 UI 元素:Popup、Toast、Snackbar、SemanticScreenReader 用于可访问性。.NET MAUI 与 Azure、SignalR 和 Microsoft Graph SDK 集成。
开发工具 — Visual Studio 2022 和 JetBrains 的 Rider。XAML Hot Reload 在 1-2 秒内更新 UI,无需重新启动应用程序。C# Hot Reload(从 .NET 6+ 开始)重新编译方法更改,无需重新启动进程。Visual Studio Debugger、Profiler 和 IntelliCode 完善了性能和代码质量诊断工具集。
常见问题解答
.NET MAUI — 是微软的跨平台框架,用于在 C# 和 XAML 中创建适用于 iOS、Android、Windows、macOS 和 Tizen 的原生应用程序。它是 Xamarin.Forms 的继承者,内置于 .NET 6+ 中,并使用单一项目(Single Project)而不是每个平台的单独项目。
.NET MAUI 使用单一项目、Handlers 代替渲染器、内置 DI 容器、iOS 的 Native AOT 和 Blazor Hybrid。Xamarin.Forms 需要每个平台的单独项目,使用 Custom Renderer 进行 UI 自定义,使用 DependencyService 进行 DI,并且不支持 Blazor。.NET MAUI 是 .NET 的一部分,Xamarin.Forms 是单独的 SDK。
是的,.NET MAUI 通过 Mac Catalyst 支持 macOS(最低版本 macOS 12.0)。MAUI 中的 iOS 应用程序会自动编译为 Mac,无需更改代码。对于原生 Mac 功能(Menu Bar、Dock、Touch ID),通过 Platforms/MacCatalyst 文件夹中的 Mac Catalyst 和 NSView 包装器使用平台调用。
不,.NET MAUI 与 Dart/Flutter 包不兼容。MAUI 使用 .NET 生态系统和 NuGet 包。对于平台功能(相机、蓝牙、生物识别),通过 Android Bindings(Kotlin/Java)和 iOS Bindings(Objective-C/Swift)使用原生库。CommunityToolkit.Maui 为常见场景提供现成的包装器。
性能差异微乎其微。.NET MAUI 在 iOS 上使用 Handlers 和 Native AOT 可达到原生 SwiftUI 应用程序性能的 95-98%。在 Android 上,与 Kotlin 应用程序的差异在 UI 渲染测试中为 3-7%(Microsoft Benchmarks, 2024)。对于大多数业务应用程序,用户察觉不到差异。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。