想了很久我决定发一个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 應用可以在 window 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