Maui的學習之路 -- 開篇
想了很久我決定發一個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
)indows 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 [1]C#平臺調用
:平臺調用 (P/Invoke) | Microsoft Docs[2]Windows Api
: pinvoke.net: memcpy (msvcrt)[3]WinUI3
: 創建第一個WinUI 3(Windows 應用 SDK)項目 - Windows apps | Microsoft Docs[4]UIKIT
:UIKit Namespace | Microsoft Docs [5]AppKit
: AppKit Namespace | Microsoft Docs[6]Community ToolKit
:使用 .NET 多平臺應用 UI (.NET MAUI) Community Toolkit入門 - .NET Community Toolkit | Microsoft Docs [7]
參考資料
[1]
.NET 多平臺應用 UI 文檔 - .NET MAUI | Microsoft Docs : https://docs.microsoft.com/zh-cn/dotnet/maui/
[2]平臺調用 (P/Invoke) | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/standard/native-interop/pinvoke
[3]pinvoke.net: memcpy (msvcrt): https://www.pinvoke.net/default.aspx/msvcrt/memcpy.html
[4]創建第一個WinUI 3(Windows 應用 SDK)項目 - Windows apps | Microsoft Docs: https://docs.microsoft.com/zh-cn/windows/apps/winui/winui3/create-your-first-winui3-app
[5]UIKit Namespace | Microsoft Docs : https://docs.microsoft.com/zh-cn/dotnet/api/uikit?view=xamarin-ios-sdk-12
[6]AppKit Namespace | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/api/appkit?view=xamarin-mac-sdk-14
[7]使用 .NET 多平臺應用 UI (.NET MAUI) Community Toolkit入門 - .NET Community Toolkit | Microsoft Docs : https://docs.microsoft.com/zh-cn/dotnet/communitytoolkit/maui/get-started