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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlDataAdapter

SqlDataAdapter 是 .NET Framework 和 .NET Core 中提供的一个数据适配器类&#xff0c;属于 System.Data.SqlClient 命名空间&#xff08;或在 .NET 6 中属于 Microsoft.Data.SqlClient 命名空间&#xff09;。它的作用是充当数据源&#xff08;如 SQL Server 数据库&#xff…

【vivado】时序报告--best时序和worst时序

利用vivado进行开发时&#xff0c;生成best时序报告和worst时序报告。 best时序报告 slow选择min_max&#xff0c;fast选择none。 worst时序报告 fast选择min_max&#xff0c;slow选择none。

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码&#xff1a;管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码&#xff0c;涵盖了常见的 HTTP 状态码分类&#xff0c;如信息响应&#xff08;1xx&#xff09;、成功状态&#xff08;2xx&#xff09;、客户端错误&a…

力扣题库-掷骰子模拟详细解析

题目如下&#xff1a; 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束&#xff0c;就是使得投掷骰子时&#xff0c;连续 掷出数字 i 的次数不能超过 rollMax[i]&#xff08;i 从 1 开始编号&#xff09;。 现在&#xff0c;给你一…

深入浅出:PHP中的数据类型全解析

文章目录 引言理解数据类型标量类型整数 (integer)浮点数 (float)布尔值 (boolean)字符串 (string) 复合类型数组 (array)对象 (object)资源 (resource)NULL 特殊类型Callable强制类型转换 实战案例总结与展望参考资料 引言 在编程的世界里&#xff0c;数据类型是构建任何应用…

当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库

解决方法&#xff1a; ldd 命令来验证程序是否加载了正确的库&#xff1a; 如检查linear_elasticity可执行文件缺少的库&#xff0c;用下面命令&#xff1a; ldd linear_elasticity 可以发现下面not found就是缺少的库&#xff0c;还有对应的库的位置已经版本 $ ldd lin…

第P1周:Pytorch实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 1. 实现pytorch环境配置 2. 实现mnist手写数字识别 3. 自己写几个数字识别试试具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python…

Seq2Seq模型的发展历史;深层RNN结构为什么出现梯度消失/爆炸问题,Transformer为什么不会;Seq2Seq模型存在问题

目录 Seq2Seq模型的发展历史 改进不足的地方 深层RNN结构为什么出现梯度消失/爆炸问题,Transformer为什么不会 深层RNN结构为什么出现梯度消失/爆炸问题: Transformer为什么不会出现梯度消失/爆炸问题: Seq2Seq模型存在问题 T5模型介绍 Seq2Seq模型的发展历史 序列到…

网络安全技术详解:虚拟专用网络(VPN) 安全信息与事件管理(SIEM)

虚拟专用网络&#xff08;VPN&#xff09;详细介绍 虚拟专用网络&#xff08;VPN&#xff09;通过在公共网络上创建加密连接来保护数据传输的安全性和隐私性。 工作原理 VPN的工作原理涉及建立安全隧道和数据加密&#xff1a; 隧道协议&#xff1a;使用协议如PPTP、L2TP/IP…

Hive 窗口函数与分析函数深度解析:开启大数据分析的新维度

Hive 窗口函数与分析函数深度解析&#xff1a;开启大数据分析的新维度 在当今大数据蓬勃发展的时代&#xff0c;Hive 作为一款强大的数据仓库工具&#xff0c;其窗口函数和分析函数犹如一把把精巧的手术刀&#xff0c;助力数据分析师们精准地剖析海量数据&#xff0c;挖掘出深…

SCAU期末笔记 - 数据库系统概念

我校使用Database System Concepts&#xff0c;9-12章不考所以跳过&#xff0c;因为课都逃了所以复习很仓促&#xff0c;只准备过一下每一章最后的概念辨析&#xff0c;我也不知道有没有用 第1章 引言 数据库管理系统&#xff08;DBMS&#xff09; 由一个互相关联的数据的集合…

Android 12系统源码_窗口管理(九)深浅主题切换流程源码分析

前言 上一篇我们简单介绍了应用的窗口属性WindowConfiguration这个类&#xff0c;该类存储了当前窗口的显示区域、屏幕的旋转方向、窗口模式等参数&#xff0c;当设备屏幕发生旋转的时候就是通过该类将具体的旋转数据传递给应用的、而应用在加载资源文件的时候也会结合该类的A…

河南省的教育部科技查新工作站有哪些?

郑州大学图书馆&#xff08;Z12&#xff09;&#xff1a;2007年1月被批准设立“教育部综合类科技查新工作站”&#xff0c;同年12月被河南省科技厅认定为河南省省级科技查新机构。主要面向河南省的高校、科研机构、企业提供科技查新、查收查引等服务。 河南大学图书馆&#xf…

Leetcode经典题6--买卖股票的最佳时机

买卖股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。…

MCPTT 与BTC

MCPTT&#xff08;Mission Critical Push-to-Talk&#xff09;和B-TrunC&#xff08;宽带集群&#xff09;是两种关键通信标准&#xff0c;它们分别由不同的组织制定和推广。 MCPTT&#xff08;Mission Critical Push-to-Talk&#xff09;标准由3GPP&#xff08;第三代合作伙伴…

去除账号密码自动赋值时的输入框背景色

问题描述&#xff1a; 前端使用账号密码登录&#xff0c;若在网页保存过当前页面的密码和账号&#xff0c;那么当再次进入该页面&#xff0c;网页会自动的把账号和密码赋到输入框中&#xff0c;而此时输入框是带有背景色的&#xff0c;与周边的白色背景显得很不协调&#xff1…

【Pytorch】torch.reshape与torch.Tensor.reshape区别

问题引入&#xff1a; 在Pytorch文档中&#xff0c;有torch.reshape与torch.Tensor.reshape两个reshape操作&#xff0c;他们的区别是什么呢&#xff1f; 我们先来看一下官方文档的定义&#xff1a; torch.reshape&#xff1a; torch.Tensor.reshape: 解释&#xff1a; 在p…

扫码与短信验证码登录JS逆向分析与Python纯算法还原

文章目录 1. 写在前面2. 扫码接口分析2. 短信接口分析3. 加密算法还原【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!…

spring6:3容器:IoC

spring6&#xff1a;3容器&#xff1a;IoC 目录 spring6&#xff1a;3容器&#xff1a;IoC3、容器&#xff1a;IoC3.1、IoC容器3.1.1、控制反转&#xff08;IoC&#xff09;3.1.2、依赖注入3.1.3、IoC容器在Spring的实现 3.2、基于XML管理Bean3.2.1、搭建子模块spring6-ioc-xml…

【认证法规】安全隔离变压器

文章目录 定义反激电源变压器 定义 安全隔离变压器&#xff08;safety isolating transformer&#xff09;&#xff0c;通过至少相当于双重绝缘或加强绝缘的绝缘使输入绕组与输出绕组在电气上分开的变压器。这种变压器是为以安全特低电压向配电电路、电器或其它设备供电而设计…