.NET MAUI与.NET for Android/IOS的关系

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 AndroidMAUI Button 转换为 Android 的 android.widget.Button
    • 在 iOS 平台,使用 .NET for iOSMAUI Button 转换为 iOS 的 UIButton
(2).NET MAUI 提供统一的跨平台开发体验
  • .NET MAUI 屏蔽了平台特定的差异,开发者只需要编写共享代码。
  • .NET for Android/iOS 则作为底层实现框架,负责调用平台原生功能,帮助 MAUI 渲染控件或执行设备操作。
(3)职责分工
  • .NET MAUI
    • 提供跨平台的抽象控件和统一 API。
    • 通过 HandlersRenderers 将控件或功能请求传递到目标平台。
  • .NET for Android/iOS
    • 负责将这些请求转换为平台原生操作,提供对设备和操作系统功能的访问。

4. 运行机制

  1. MAUI 构建应用逻辑

    • 开发者在 MAUI 项目中定义 UI 和业务逻辑。

    • 示例:

      复制代码
      <Button Text="Click Me" Clicked="OnButtonClicked" />
  2. MAUI 通过 Handlers 调用 .NET for Android/iOS

    • MAUI 中的 Button 是一个跨平台抽象,通过 Handler 机制调用特定平台的实现。
    • Android 平台的 ButtonHandler 会调用 .NET for Android 的功能,将其映射到 android.widget.Button
    • iOS 平台的 ButtonHandler 会调用 .NET for iOS 的功能,将其映射到 UIButton
  3. .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应用的如何在各自的系统运行的,以及如何使用第三方库。

相关推荐
sun0077006 小时前
android ndk编译valgrind
android
AI视觉网奇8 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空8 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet9 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin9 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo0305198710 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
00后程序员张12 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
柳岸风14 小时前
Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示
android·ide·android studio
编程乐学14 小时前
安卓原创--基于 Android 开发的菜单管理系统
android
咕噜签名分发冰淇淋15 小时前
内测分发是什么?
ios