.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应用的如何在各自的系统运行的,以及如何使用第三方库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚焦 Facebook 隐私安全,守护用户数字家园

随着数字技术的飞速发展&#xff0c;社交媒体已成为我们生活中不可或缺的一部分&#xff0c;而隐私与安全的问题也愈加突出&#xff0c;特别是在 Facebook 这样拥有全球数十亿用户的平台上。如何有效地保障用户隐私&#xff0c;守护用户的数字家园&#xff0c;已成为社会各界关…

Linux C/C++编程的线程创建

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

Gitee上获取renren-fast-vue install并run dev错误处理

目的&#xff1a;获取一个手脚架、越简约越好、越干净越好、于是看上了renren-fast-vue… 前端&#xff1a;vue2 后端&#xff1a;jdk1.8 mysql 5.7 SpringBoot单体架构 一开始只是下载前后端项目到本地&#xff0c;一堆乱七八糟的错误&#xff0c;网上找的资料也参差不齐… …

线程和进程(juc)

线程 一&#xff1a;概念辨析 1&#xff1a;线程与进程 进程&#xff1a; 1&#xff1a;程序由指令和数据组成&#xff0c;指令要执行&#xff0c;数据要读写&#xff0c;就需要将指令加载给cpu&#xff0c;把数据加载到内存&#xff0c;同时程序运行时还会使用磁盘&#x…

五、docker的网络模式

五、docker的网络模式 5.1 Docker的四种网络模式 当你安装docker时&#xff0c;它会自动创建三个网络&#xff0c;可使用如下命令查看&#xff1a; [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7390284b02d6 bridge bridge lo…

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode&#xff1f;二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…

数据结构——有序二叉树的删除

在上一篇博客中&#xff0c;我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次&#xff0c;点赞18次&#xff0c;收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服务端和本地的关联关系即可

树与图深度优先遍历——acwing

题目一&#xff1a;树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举&#xff0c;试探每个点&#xff0c;除去之后&#xff0c;连通分量最大值是多少&#xff0c; 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数&#xff0c;以及可以求各分树的点数&am…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…

Facebook广告文案流量秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密&#xff01; 一、广告文案怎么写&#xff1f; 正文&#xff1a;这是帖子的正文&#xff0c;出现在您姓名的正下方。它可…

java面向对象实验——扫雷+24点

扫雷 窗口绘制&#xff1a; GameWin package com.sxt;import javax.swing.*;public class GameWin extends JFrame {void launch(){this.setVisible(true);this.setSize(500, 500);this.setLocationRelativeTo(null);this.setTitle("SWE23070扫雷游戏");this.setD…

Ubuntu24安装 python3-mysql.connector

正确命令 sudo apt install python3-mysql.connector说明 网络上已有的文章Python版本和Ubuntu版本旧&#xff0c;命令不生效。

【西门子PLC.博途】——在S71200里写时间设置和读取功能块

之前我们在这篇文章中介绍过如何读取PLC的系统时间。我们来看看在西门子1200里面有什么区别。同时也欢迎关注gzh。 我们在S71200的帮助文档中搜索时间后找到这个数据类型 在博途中他是一个结构体&#xff0c;具体为 然后我们再看看它带的读取和写入时间块 读取时间&#xff1…

如何搭建智慧工厂?IOT+AI:赋能未来制造业灯塔工厂建设

在当今数字化和智能化的浪潮中&#xff0c;传统制造业正经历着前所未有的变革。智慧工厂作为智能制造的核心内容&#xff0c;正逐步成为未来制造业的发展趋势。本文将深入探讨智慧工厂的搭建过程&#xff0c;以及IoT&#xff08;物联网&#xff09;和AI&#xff08;人工智能&am…

内存图及其画法

所有的文件都存在硬盘上&#xff0c;首次使用的时候才会进入内存 进程&#xff1a;有自己的Main方法&#xff0c;并且依赖自己Main运行起来的程序。独占一块内存区域&#xff0c;互不干扰。内存中有一个一个的进程。 操作系统只认识c语言。操作系统调度驱动管理硬件&#xff0…

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文&#xff0c;一手掌握&#xff0c;你值得拥有&#xff0c;让我们开始吧&#xff5e; ufw 与 iptables的关系 理论介绍&#xff1a; ufw&#xff08;Uncomplicated Firewall&#xff09;是一个基于iptables的前端工具&#xf…

Python使用Selenium自动实现表单填写之蛇年纪念币蛇钞预约(附源码,源码有注释解析,已测试可用

Python实现纪念币预约自动填写表单 声明:本文只做技术交流,不可用代码为商业用途,文末有源码下载,已测试可用。 Part 1 配置文件改写(源码 有详细的注释说明 读取配置文件,自己组数据库,录入信息 配置文件 Part 2 主函数 每一期的xpath路径都不一样 所以需要提前去网站…

内存管理面试常问

为什么要有虚拟内存&#xff1f; 虚拟内存 如果你是电⼦相关专业的&#xff0c;肯定在⼤学⾥捣⿎过单⽚机。 单⽚机是没有操作系统的&#xff0c;所以每次写完代码&#xff0c;都需要借助⼯具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c; 单⽚机的 CPU …