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