.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,一经查实,立即删除!

相关文章

【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…

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

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

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

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

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

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

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

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

【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…

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;通过至少相当于双重绝缘或加强绝缘的绝缘使输入绕组与输出绕组在电气上分开的变压器。这种变压器是为以安全特低电压向配电电路、电器或其它设备供电而设计…

车机端同步outlook日历

最近在开发一个车机上的日历助手&#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现&#xff0c;毕竟手机日历是手机厂商自己带的系统应用&#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

城电科技 | 光伏景观长廊 打造美丽乡村绿色低碳示范区 光伏景观设计方案

光伏景观长廊是一种结合了光伏发电技术和零碳景观设计的新型公共公共设施&#xff0c;光伏景观长廊顶上的光伏板不仅可以为周边用电设备提供清洁电能&#xff0c;而且还能作为遮阳设施使用&#xff0c;为人们提供一个美丽又实用的休闲娱乐空间。 光伏景观长廊建设对打造美丽乡…

开发系统准备与开发环境配置总结

开发前系统配置及环境搭建 系统配置0 Github打不开、速度慢怎么办1 WSL、Linux、Ubuntu、Docker都是什么鬼2 在Windows下安装WSL和Ubuntu3 配置MySQL4 配置Redis并启动服务5 Docker&#xff08;Windows和Ubuntu下&#xff09;6 Nginx 系统配置 你好&#xff01; 这是你第一次使…

uniapp 添加loading

在uniapp中添加loading可以使用uni的API uni.showLoading 方法。以下是一个简单的示例代码 // 显示loading uni.showLoading({title: 加载中 });// 假设这里是异步操作&#xff0c;比如网络请求 setTimeout(function () {// 隐藏loadinguni.hideLoading(); }, 2000);

C++(九)

前言&#xff1a; 本文主要讲述运算符的优先顺序。 一&#xff0c;运算符的优先级。 请看以下表达式&#xff1a; a32*5 运算结果为&#xff1a;13. 可以看到&#xff0c;在此代码中&#xff0c;先运行了2*5的结果&#xff0c;在此基础上在进行3操作&#xff0c;因此结果…

【Altium Designer 】AD如何使用嘉立创元器件的3D封装

1.下载3D封装 以STM32F407VGT6为例&#xff0c;进入嘉立创商城网站&#xff0c;找到需要的元器件封装 复制编号&#xff0c;打开嘉立创EDA&#xff0c;编译器选择专业版&#xff0c;新建工程&#xff0c;点击PCB1 复制编号在搜索框中&#xff0c;点击搜索&#xff0c;然后放置…

爬虫运行后数据如何存储?

爬虫运行后获取的数据可以存储在多种不同的存储系统中&#xff0c;具体选择取决于数据的规模、查询需求以及应用场景。以下是一些常见的数据存储方法&#xff1a; 1. 文件系统 对于小型项目或临时数据存储&#xff0c;可以直接将数据保存到本地文件中。常见的文件格式包括&…

【机器学习】机器学习的基本分类-监督学习-梯度提升树(Gradient Boosting Decision Tree, GBDT)

梯度提升树是一种基于**梯度提升&#xff08;Gradient Boosting&#xff09;**框架的机器学习算法&#xff0c;通过构建多个决策树并利用每棵树拟合前一棵树的残差来逐步优化模型。 1. 核心思想 Boosting&#xff1a;通过逐步调整模型&#xff0c;使后续的模型重点学习前一阶段…

【机器学习 | 基于Lasso回归和随机森林的上海链家二手房房价预测】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 去除缺失数据2.5 面积、价格、单价、楼层、建筑时间数据提取2.6 朝向数据处理 &#x1f3f3;️‍&#x1f308; 3. 特…

【HarmonyOS NEXT】flexShrink属性

一、背景 希望达到的布局效果是文字与按钮左右对齐&#xff0c;居中显示&#xff0c;但实际效果中按钮的显示与效果不符&#xff0c;如下图所示 二、问题 按钮是用row组件包裹的text&#xff0c;左右padding给的是一样的大小&#xff0c;但是明显右边padding会比左边padding大…