想了很久我決定發一個 Maui 介紹作為開篇,雖然這是老生常談的話題,但是不能沒有這樣的探討(請容我湊一篇)。
什麼是 .NET Maui
.NET Maui 是微軟的一款基於 .Net 多平台應用 UI (.NET MAUI) 的跨平台框架,使用 C# 和 XAML 建立原生行動和桌面應用程式。使用 .NET MAUI,可以開發從單一共享程式碼庫在 Android、iOS、macOS 和 Windows 上執行的應用程式。
.NET Maui 脫胎於 Xamarin.Forms,如果有 Xamarin.Forms 的使用經驗,那麼 Maui 的使用將變得非常得心應手。使用 .NET MAUI,可以使用單一專案建立多平台應用程式,但如有必要,可以加入平台專屬的原始碼和資源。.NET MAUI 的主要目標是在單一程式碼庫中實現盡可能多的應用程式邏輯和 UI 佈局。

.NET Maui 支援的平台
- Android 5.0 或更高版本 (API 21)
- iOS 10 或更高版本 (UIKit)
- macOS 10.13 或更高版本 (Mac Catalyst UIKit)
- Windows 11 和 Windows 10 (1809) 或更高版本 (WinUI3 WindowsAppSdk)
- Tizen,由三星支援(目前已經整合到工程範本中)
- Linux,由社群支援
.NET Maui 的工作原理
.NET MAUI 將 Android、iOS、macOS 和 Windows API 統一到單一 API 中,該 API 允許一次編寫一次執行的任何開發人員體驗,同時提供對每個原生平台的各個方面的深入存取。
.NET 6 提供了一系列平台專屬的框架來建立應用程式:.NET for Android、.NET for iOS、.NET for macOS 以及 Windows UI 3 (WinUI 3) 程式庫。這些框架都有權存取同一個 .NET 6 基底類別庫 (BCL)。此程式庫將基礎平台的詳細資訊從程式碼中抽象化。BCL 依賴於 .NET 執行階段,為程式碼提供執行環境。
對於 Android、iOS 和 macOS,環境由 Mono 實作,這是 .NET 執行階段的實作。在 Windows 上,Win32 提供執行環境。
雖然 BCL 使在不同平台上執行的應用程式能夠共用常見的商業邏輯,但各種平台具有為應用程式定義使用者介面的不同方式,並且它們提供了不同的模型,用於指定使用者介面元素的通訊和互通方式。可以使用適用於 Android、iOS、macOS、WinUI 3 的 .Net 單獨為每個平台建立 UI,但此方法要求為每個單獨的裝置系列維護程式碼庫。.NET MAUI 提供了一個框架,用於為行動和桌面應用程式建構 UI。
下圖顯示了 .NET MAUI 應用程式的架構高階檢視:

在 .NET MAUI 應用程式中,編寫主要與 .NET MAUI API 互動的程式碼,NET MAUI 直接使用原生平台 API。此外應用程式程式碼還可以根據需要直接使用平台 API。
.NET MAUI 應用程式可以在 Windows PC 或 Mac 上編寫(目前需要使用 vs2022 preview),並編譯為原生應用程式套件:
- Android 使用 .NET MAUI 編譯的應用程式從 C# 編譯到中間語言 (IL),然後在應用程式啟動時 (JIT) 編譯為原生組件。
- iOS 使用 .NET MAUI 編譯的應用程式完全原生編譯(從 C# 編譯為原生 ARM 組件程式碼的 AOT)。
- macOS 使用 .NET MAUI 編譯的應用程式使用 Mac Catalyst,這是 Apple 提供的一種解決方案,它可將使用 UIKit 產生的 iOS 應用程式引入桌面,並根據需要使用其他 AppKit 和平台 API 對其進行擴充。
- Windows 使用 .NET MAUI 產生的應用程式使用 Windows UI 3 (WinUI 3) 程式庫來建立面向 Windows 桌面的原生應用程式。
.NET Maui 的其他應用方式
- 雖然 .NET Maui 已經提供了對各個平台原生控制項的封裝,但是你仍然可以使用 Maui 提供的自繪引擎繪製符合自己需求的控制項(Microsoft.Maui.Graphics)
- 你也可以建立 .NET MAUI Blazor 應用程式,來達到和網頁一樣的使用體驗,.NET MAUI Blazor 應用程式還需要更新的平台特定的 WebView 控制項,目前支援平台如下:
- Android 7.0 (API 24) 或更高版本(Chrome)
- iOS 14 或更高版本(Safari)
- Mac Catalyst macOS 11 或更高版本(Safari)
- Windows 11、Windows 10 (1809) 或更高版本(Edge webview2)
- Tizen(未知)
- Linux(未知)
.NET Maui 開發需要學習的技術知識:
- 基礎:
- .NET
- C#
- Xaml
- Maui
- 擴充:
- WinUI3 api 以及 Windows 平台 Api(Windows)
- Android api(Android)(通常不需要,如果你需要呼叫一些硬體)
- UIKit,iOS 平台 api(iOS)(通常不需要,如果你需要呼叫一些硬體)
- UIKit,Appkit, MacOS api(Mac)
- Blazor(不是必須)
.NET Maui 的優缺點
優點:
使用 C# + .Net 開發,上手簡單,升級容易,配合宇宙第一 IDE 工作效率不可同日而語
微軟技術基本都存在共性(你可以輕鬆轉戰 WPF)
大廠保證
在不同的平台使用平台自身控制項,保證原生效能
配合 Blazor 可以實現跟網頁端一致體驗
缺點:
不支援 win7,甚至還挑 win10 的版本
目前雖然正式釋出但仍不夠穩定
因為是 C# 所以也許可能不如 java 系或者前端那麼容易找到滿足的工作(大廠一般都是 java)
微軟喜歡砍砍砍
雖然保證原生,但這也就意味著你需要對不同的平台做相關適配(非自繪)
雖然保證原生,這也意味著你需要學習平台相關知識(控制項部分行為也有不同)(當然這是所有跨平台應用程式都需要學習的)
同類跨平台開發框架:
- QT(使用 C++,我個人認為是目前真正意義上的跨平台,甚至還支援嵌入式)(自繪)
- Flutter(谷歌的跨平台框架,使用 Dart 語言)(自繪)
- Uno platform(C# 實作方式類似 Maui)
- Avalonia(C# 類 WPF)(自繪)
- CPF(C# 國產跨平台 UI 開發框架,支援龍芯)(自繪)
- Electron(網頁技術棧方向)
相關學習連結:
- Maui:.NET 多平台應用程式 UI 文件 - .NET MAUI | Microsoft Docs
- C# 平台呼叫:平台呼叫 (P/Invoke) | Microsoft Docs
- Windows Api:pinvoke.net: memcpy (msvcrt)
- WinUI3:建立第一個 WinUI 3(Windows 應用程式 SDK)專案 - Windows apps | Microsoft Docs
- UIKIT:UIKit Namespace | Microsoft Docs
- AppKit:AppKit Namespace | Microsoft Docs
- Community ToolKit:使用 .NET 多平台應用程式 UI (.NET MAUI) Community Toolkit 入門 - .NET Community Toolkit | Microsoft Docs