自学内容网 自学内容网

.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就可以了。更新完打开以后看到如下界面
 

image


这里比较奇怪的是.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 和跨平台控件(如 ButtonEntry 等),开发者可以通过它实现一次开发、多平台运行的目标。

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 来实现其平台特定功能。
  • 每个控件或功能(如 ButtonEntryLabel)都会被映射到目标平台的原生实现:
    • 在 Android 平台,使用 .NET for Android 将 MAUI Button 转换为 Android 的 android.widget.Button
    • 在 iOS 平台,使用 .NET for iOS 将 MAUI Button 转换为 iOS 的 UIButton
(2).NET MAUI 提供统一的跨平台开发体验
  • .NET MAUI 屏蔽了平台特定的差异,开发者只需要编写共享代码。
  • .NET for Android/iOS 则作为底层实现框架,负责调用平台原生功能,帮助 MAUI 渲染控件或执行设备操作。
(3)职责分工
  • .NET MAUI
    • 提供跨平台的抽象控件和统一 API。
    • 通过 Handlers 或 Renderers 将控件或功能请求传递到目标平台。
  • .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应用的如何在各自的系统运行的,以及如何使用第三方库。


原文地址:https://blog.csdn.net/weixin_49784554/article/details/144282029

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!