2024年11月13日微軟發布了.Net9.0,我打算體驗一下。安裝好.Net9.0 SDK后發現Visual Studio識別不到9.0,但是通過命令行dotnet --info查看是正常的,后面看到了VS有版本可以升級,把VS升級到17.12.0就可以了。更新完打開以后看到如下界面
?
這里比較奇怪的是.Net for Android,MAUI不是可以開發多個平臺嘛,為什么還有保留一個單獨開發安卓的項目。從早期的Xamarin.Forms就有還有一個Xamarin.Android/Xamarin.IOS,既然有這個疑惑打算了解一下Maui和.Net for Android/IOS的關系。之前一直處于了解.NET MAUI可以開發移動端軟件,并沒有深入了解,有開發過一個安卓小應用自己使用。
1. .NET MAUI 是什么?
- .NET MAUI?是一個跨平臺框架,旨在通過一個共享代碼庫來構建運行在多個平臺(包括 Android、iOS、Windows 和 macOS)上的應用程序。
- 它提供統一的 API 和跨平臺控件(如?
Button
,?Entry
?等),開發者可以通過它實現一次開發、多平臺運行的目標。
2. .NET for Android/iOS 是什么?
- .NET for Android?和?.NET for iOS?是 .NET 平臺提供的專用框架,用于分別開發 Android 和 iOS 的本地應用程序。
- 它們提供了對各自平臺原生 API(如 Android 的?
Java
?API 和 iOS 的?UIKit
?API)的封裝,使開發者可以使用 C# 調用這些原生功能。
3. 兩者的關系
(1).NET MAUI 依賴 .NET for Android/iOS
- .NET MAUI 是一個跨平臺抽象層,它在運行時依賴?.NET for Android?和?.NET for iOS?來實現其平臺特定功能。
- 每個控件或功能(如?
Button
,?Entry
,?Label
)都會被映射到目標平臺的原生實現:- 在 Android 平臺,使用?.NET for Android?將?
MAUI Button
?轉換為 Android 的?android.widget.Button
。 - 在 iOS 平臺,使用?.NET for iOS?將?
MAUI Button
?轉換為 iOS 的?UIButton
。
- 在 Android 平臺,使用?.NET for Android?將?
(2).NET MAUI 提供統一的跨平臺開發體驗
- .NET MAUI?屏蔽了平臺特定的差異,開發者只需要編寫共享代碼。
- .NET for Android/iOS?則作為底層實現框架,負責調用平臺原生功能,幫助 MAUI 渲染控件或執行設備操作。
(3)職責分工
- .NET MAUI:
- 提供跨平臺的抽象控件和統一 API。
- 通過?
Handlers
?或?Renderers
?將控件或功能請求傳遞到目標平臺。
- .NET for Android/iOS:
- 負責將這些請求轉換為平臺原生操作,提供對設備和操作系統功能的訪問。
4. 運行機制
-
MAUI 構建應用邏輯
- 開發者在 MAUI 項目中定義 UI 和業務邏輯。
- 示例:
<Button Text="Click Me" Clicked="OnButtonClicked" />
-
MAUI 通過?
Handlers
?調用 .NET for Android/iOS- MAUI 中的?
Button
?是一個跨平臺抽象,通過?Handler
?機制調用特定平臺的實現。 - Android 平臺的?
ButtonHandler
?會調用?.NET for Android?的功能,將其映射到?android.widget.Button
。 - iOS 平臺的?
ButtonHandler
?會調用?.NET for iOS?的功能,將其映射到?UIButton
。
- MAUI 中的?
-
.NET for Android/iOS 調用平臺原生功能
- .NET for Android?會通過 JNI 調用 Android 的 Java API。
- .NET for iOS?會通過綁定庫直接調用 iOS 的 Objective-C API。
5. 對比:.NET MAUI 與 .NET for Android/iOS
特性 | .NET MAUI | .NET for Android/iOS |
---|---|---|
開發場景 | 跨平臺開發(Android、iOS、Windows、macOS)。 | 專注于單一平臺(Android 或 iOS)開發。 |
代碼共享 | 允許跨平臺共享代碼,大部分邏輯通用。 | 代碼僅限于單一平臺。 |
UI 層次 | 提供抽象的跨平臺控件。 | 提供原生平臺控件訪問能力。 |
底層依賴 | Android 和 iOS 部分分別依賴 .NET for Android 和 .NET for iOS。 | 無進一步依賴,直接調用平臺原生 API。 |
適用場景 | 開發跨平臺應用(少量平臺特定代碼)。 | 深度定制某個平臺(如 Android 或 iOS)。 |
6. 示例對比
(1).NET MAUI 示例
跨平臺定義一個按鈕:
<Button Text="Click Me" Clicked="OnButtonClicked" />
- 在 Android 上,渲染為?
android.widget.Button
。 - 在 iOS 上,渲染為?
UIButton
。
(2).NET for Android 示例
直接在 Android 平臺調用原生 API:
[Activity(Label = "MyApp", MainLauncher = true)]
public class MainActivity : Activity
{protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);Button button = new Button(this);button.Text = "Click Me";button.Click += (s, e) => { /* Handle Click */ };SetContentView(button);}
}
(3).NET for iOS 示例
直接在 iOS 平臺調用原生 API:
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{public override bool FinishedLaunching(UIApplication app, NSDictionary options){var window = new UIWindow(UIScreen.MainScreen.Bounds);var button = new UIButton(UIButtonType.System);button.SetTitle("Click Me", UIControlState.Normal);window.RootViewController = new UIViewController();window.RootViewController.View.AddSubview(button);window.MakeKeyAndVisible();return true;}
}
7. 總結
-
.NET MAUI 和 .NET for Android/iOS 的關系:
- .NET MAUI 提供跨平臺開發能力,負責抽象和統一 API。
- .NET for Android/iOS 提供底層實現,負責與原生平臺交互。
-
關鍵點:
- .NET MAUI?依賴?.NET for Android/iOS?來實現其跨平臺功能。
- .NET for Android/iOS?是專注于單一平臺開發的工具,更適合需要深度定制的平臺特定應用。
至此已經明白了為什么有MAUI還可以創建.NET for Android/iOS了,MAUI是把UI給抽象了,具體的實現還是要靠.NET for Android/iOS在不同平臺實現。根據MAUI的設計,就算是Visual Studio沒有.NET for Android/iOS項目模板提供,.NET for Android/iOS底層也是少不了的,當然了Visual Studio提供了.NET for Android/iOS的模板,直接開發安卓和IOS也是可以的,也有益于那些熟悉用Java開發安卓和swift開發ios應用的開發人員。還有兩個問題就是.NET for Android/iOS應用的如何在各自的系統運行的,以及如何使用第三方庫。