.NET MAUI 跨平台应用程序 (Windows App 和 Android )示例

也就前周,.Net MAUI正式版出来了 ,一个支持跨平台的UI框架,Linux支持情况官网也没说,按理来说应该也是支持的,刚好,我最近也在研究GUI的基本原理,微软出品还是值得深入研究一下的,就先来个样例,瞅瞅。

MAUI 安装

首先得是 Visual Studio 2022,然后,版本更新到最新,版本为 17.3.0

057de1b49ab0a0ebe458d570a5e0f85e.png

打开 Visual Studio Installer 进行安装版本,即可,建议直接安装最新,省事儿。

bb7951813a1af644f65da2d44f929297.png

安装的时候,一定要选择MAUI工作负荷,要不然,升级了最新版本,可能还没有这个模板。

367be90d00523966f706c8fb7e08657c.png

MAUI 新建项目

其实新建的时候,有三个可选,但是,实际上有两个项目,一个是.Net MAUI Blazor应用,一个是.NET MAUI 应用。

从这个趋势上来看,Blazor应用,微软还是很看好的。

新建一个 .NET MAUI应用。

1a1c84756b1b24738a08e83f359eb0a9.png

默认项目,打开跟WPF 很像,文件后缀也是Xaml

67636987edf154099f9bf31e6092dfd2.png

但是在这个平台部分,支持了多个平台基本,安卓,苹果微软的都支持了。

b1f4315608ce44dc05e8fe5cafa6c51f.png

那么,就达到了下图的目的了,真正实现了跨平台的UI。

cf28bbede5de29d2e727002c67943f29.png

MAUI 框架简单分析

有一个神奇的发现啊,首先 Visual Studio 2022 的IDE的窗体竟然是WPF写的,这个666。可见微软对自己家产品的支持力度。

52be1b9d6ea65effe1b33e84081b954f.png

另外,MAUI 项目运行后,打开是这个样子,还可以点击一下,算是官方提供的最简单的案例了。

461be60bccc910a7965352072f1c034b.png

经过分析,它是基于WIN32的,也验证了我的猜想,要想设计一个GUI,必须得从系统的本地UI入手,才是最合适的。

6c35a4dc4f4902878de52ab5730aa07b.png

所以,它是基于windwos系统本地的窗口的API,经过自己的GUI技术进行渲染的。

从官方源码里看到

4d1184cb905a40c17874602f73f32104.png

也是支持Skia渲染支持的,可见现在UI的跨平台渲染技术开始有聚合之势。

从官方文档里也透漏Xamarin.Forms 可以直接平移到 .NET MAUI上,可见,也可以把它当做 Xamarin.Forms的升级版。

.NET MAUI 的工作原理

.NET MAUI 将 Android、iOS、macOS 和 Windows API 统一到单个 API 中,该 API 允许在任意位置运行一次的开发人员体验,同时提供对每个本机平台的各个方面的深入访问。

.NET 6 提供了一系列特定于平台的框架来创建应用:适用于 Android 的 .NET、适用于 iOS 的 .NET、适用于 macOS 的 .NET 和 Windows UI 3 (WinUI 3) 库。这些框架都有权访问同一个 .NET 6 基类库 (BCL) 。此库将基础平台的详细信息从代码中抽象化。BCL 依赖于 .NET 运行时,为代码提供执行环境。对于 Android、iOS 和 macOS,环境由 Mono 实现,这是 .NET 运行时的实现。在 Windows 上,.NET CoreCLR 提供执行环境。

虽然 BCL 使在不同平台上运行的应用能够共享常见的业务逻辑,但各种平台具有为应用定义用户界面的不同方式,并且它们提供了不同的模型,用于指定用户界面元素的通信和互操作方式。可以使用适用于 Android、适用于 iOS 的 .NET for iOS、适用于 macOS 的 .NET 或 WinUI 3) 的相应平台特定框架 (.NET 单独为每个平台创建 UI,但此方法要求你为每个单独的设备系列维护代码库。

.NET MAUI 提供了一个框架,用于为移动和桌面应用构建 UI。下图显示了 .NET MAUI 应用的体系结构的高级视图:

12c35bf896cf00d2dc0007a4ae454e2d.png

在 .NET MAUI 应用中,编写主要与 .NET MAUI API (1) 交互的代码。然后,.NET MAUI 直接使用本机平台 API (3) 。此外,应用代码还可以根据需要直接切换平台 API (2) 。

.NET MAUI 应用可以在电脑或 Mac 上编写,并编译为本机应用包:

  1. 1. 使用 .NET MAUI 编译的 Android 应用从 C# 编译为中间语言 (IL) ,然后在应用启动时 (JIT) 编译为本机程序集。

  2. 2. 使用 .NET MAUI 生成的 iOS 应用完全提前 (AOT) 从 C# 编译为本机 ARM 程序集代码。

  3. 3. 使用 .NET MAUI 构建的 macOS 应用使用 Mac Catalyst,这是 Apple 提供的一种解决方案,可将使用 UIKit 生成的 iOS 应用引入桌面,并根据需要使用其他 AppKit 和平台 API 进行扩充。

  4. 4. 使用 .NET MAUI 生成的 Windows 应用使用 Windows UI 3 (WinUI 3) 库来创建面向 Windows 桌面的本机应用。

所以,实际上windows上编译的应该是 Windows UI3 技术了。UI技术果真复杂。。。

.NET MAUI Windows

这个跟之前的WPF和WinForm完全不一样,双击Debug下的Exe不可以运行(暂时查到这些信息),但是,这个项目是当成了WINUI3项目来实现的,所以,针对于系统来讲就是下边的应用的概念。

默认项目运行就会添加应用到系统,也可以通过项目 右键 部署 实现部署到本机。

9d2793ec131b9d13d6e5efd26dfa0d6a.png

可以在应用里查看应用的信息。

12ef5b7b56491ee5c559fa093969921c.png

在系统的应用管理里就有它的信息了。

项目分发暂时只能通过发布功能发布成包

创建 .NET MAUI Windows 分发包

第一步,创建

5f4228489900c21740e13656c9acd2a6.png0f908be70eea632bd0ec0474324b5a27.png

第二步创建证书

19311c91b5640ce294fd1313b15403aa.png

如果公司有直接用,否则,就自己创建一个私人的。

账号密码记住。

第三步创建版本

自己看着填写。

646978f0f1d23bfe35f59b6efc90332e.png

.NET MAUI Windows 分发包安装指南

安装完成后,点击地址

d48deed41f9895aa21534e716643e54f.png

打开文件夹,有以下包文件(主要是 MauiApp1_1.0.3.0_x86_Debug.cer 和 MauiApp1_1.0.3.0_x86_Debug.msix)

3553ec4ac958b694a3125ce3b6c9526a.png

复制包到另外一台机器上,如果没有安装 证书,会有以下提示。

16affce397e9bf6a11b697432673336c.png

这个时候,我们双击安装证书 MauiApp1_1.0.3.0_x86_Debug.cer ,选项一定要选对,要不然,提示还会有问题。

4cbceab56681767a5bc5683a3c457928.png

证书安装完之后,双击 MauiApp1_1.0.3.0_x86_Debug.msix ,就发现已经可以安装了。

b69f72b603b798f0fe05250141df4587.png

安装完之后,系统已经有了此应用,另外安装还是有点慢,毕竟我这个是官方示例。

98a738e1597cfa1e06855636e9efb72f.png

.NET MAUI Android

我这边是手机直连调试(关于手机-版本号 点击6下-开发者模式-打开USB调试-连接USB到电脑即可),当然,也可以用它的虚拟机,都是通过Android ADB 通信方式来实现的。

直接选择,真机调试

74e3706b49183e156af3522481c00bd2.png

这个时候,手机就展现了当前的应用,手机桌面也会安装此APP。

287baccf6a0524a48d93296d0b2a03e7.jpeg

在Debug目录是能看到此 安装包的(com.companyname.mauiapp1.apk)

125ac7b27df8c84863ea808b1abc6903.png

总结

MAUI不论咋说都是微软官方出品,还是值得深入研究一下的,另外现在基本都是跨平台的节奏,还是要紧跟一下时代。

整体流畅度我个人感觉比 Flutter 好点,可能是因为,微软的缘故吧,安装很方便,不用考虑太多。

参考文档

https://docs.microsoft.com/zh-cn/dotnet/maui/

一键三连呦!,感谢大佬的支持,您的支持就是我的动力!

版权

蓝创精英团队(公众号同名,CSDN 同名,CNBlogs 同名)

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

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

相关文章

OpenStack 计算节点删除

前提 计算节点中一个僵尸计算节点存在,而里面的CPU数目在总物理CPU中,导致认为当前能创建实例。而实际没有这么多资源。其中node-11为僵尸节点。 原因 删除计算节点不能直接格式化该服务器,否则在控制节点的数据库上会存在该计算节点的数据。…

PHP 7.2 新功能介绍

PHP 7.2 已經在 2017 年 11 月 30 日 正式發布 。這次發布包含新特性、功能,及優化,以讓我們寫出更好的代碼。在這篇文章裡,我將會介紹一些 PHP 7.2 最有趣的語言特性。 你可以在 Requests For Comments 頁面查看完整的更動清單。 核心改进 参…

如何打造单文件 Blazor Server 应用

前言上次&#xff0c;我们介绍了《如何打造单文件前后端集成 ASP.NET Core 应用》。但是&#xff0c;网友说&#xff0c;对于 Blazor Server 项目此方法无效。于是&#xff0c;我们测试了一下&#xff1a;BlazorApp1.csproj<Project Sdk"Microsoft.NET.Sdk.Web"&g…

Android线程池详解

引入线程池的好处 1&#xff09;提升性能。创建和消耗对象费时费CPU资源 2&#xff09;防止内存过度消耗。控制活动线程的数量&#xff0c;防止并发线程过多。 我们来看一下线程池的简单的构造 [html] view plaincopy print?public ThreadPoolExecutor(int corePoolSize, …

win11下vscode 自动升级失败 There was an error while marking a file for deletion

当升级vscode时出现下方报错&#xff1a; There was an error while marking a file for deletion:Failed to mark file for deletion:拒绝访问.Please verify there are no Visual Studio Code processes still executing既然是“拒绝访问”应该是权限问题&#xff0c;关闭vsc…

盘点大厂的那些开源项目 - 哔哩哔哩

哔哩哔哩现为中国年轻世代高度聚集的文化社区和视频平台&#xff0c;被粉丝们亲切地称为“B站”。overlord分类&#xff1a;缓存服务解决方案开发语言&#xff1a;GOOverlord是哔哩哔哩基于Go语言编写的memcache和redis&cluster的代理及集群管理功能&#xff0c;致力于提供…

单元测试,到底什么是单元测试,为什么单测这么难写

很多小伙伴想知道单测到底该怎么写&#xff0c;于是&#xff0c;文章就来了&#xff01; 话不多说&#xff0c;发车&#xff01; 来源于yes的练级攻略 &#xff0c;作者是Yes呀 到底什么是单元测试 这个问题看似非常简单&#xff0c;单元测试嘛&#xff0c;不就是咱们开发自己…

Linux 学习和教训

今天在学习Linux的时候&#xff0c;突然脑抽风&#xff0c;在根目录下执行了这样一条命令rm -rf *当时就觉得空气凝固了。。。那时也没有想到可以用数据恢复软件恢复。直接就重启了。重启之后发现&#xff0c;就去就直接是grub>晕菜。。突然间想到可以时候救援模式&#xff…

WinForm(八)窗体,窗体

我们在控件那篇文章里说过&#xff0c;窗体和控件都是一个类&#xff0c;项目中一个个窗体&#xff0c;都是Form类的子类。关于这个类有几个重要的成员&#xff0c;也是最常用成员&#xff0c;以供初学者了解&#xff1a;Load事件&#xff1a;发生在构造函数后&#xff0c;Show…

java8

实验总结 没问题 代码托管 https://git.oschina.net/shuoge/java8 转载于:https://www.cnblogs.com/haha-23333/p/6875325.html

抓包工具fiddler和wireshark对比

了解过网络安全技术的人都知道一个名词“抓包”。那对于局外人&#xff0c;一定会问什么是抓包&#xff1f;考虑到&#xff0c;大家的技术水平不一&#xff0c;我尽可能用非专业的口吻简单的说一下。 抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&am…

你被大数据“杀熟”过吗?怎么解决的?丨Q言Q语

点击关注 InfoQ&#xff0c;置顶公众号 接收程序员的技术早餐网友“廖师傅廖师傅”表示&#xff0c;他经常通过某网站订某个特定酒店的房间&#xff0c;长年价格在 380 元 -400 元。偶然一次&#xff0c;他从前台得知酒店淡季的价格在 300 元上下。他用朋友的账号查询也是 300 …

Blazor VS Vue

Vue——两分钟概述Vue 是一个JavaScript 框架。在其最简单的模式中&#xff0c;您可以简单地将核心 Vue 脚本包含在您的应用程序中&#xff0c;然后开始构建您的组件。除此之外&#xff0c;对于更复杂的应用程序&#xff0c;您可以使用 Vue 自己的 CLI 创建&#xff08;并最终发…

SAP ECC EHP7 RFC 发布成WebService

http://www.cnblogs.com/mingdashu/p/6877622.html 1、说明介绍 本文将RFC发布成WebService的详细步骤 不介绍如何创建rfc。 2、WebService创建 2.1、调用创建命令 在RFC界面点击 实用程序-->更多实用程序-->创建WEB服务-->来自函数模块 2.2、定义Web Service 2.2.1、…

一文把RabbitMQ讲透了,佩服!

目录 背景 消息队列 | 消息队列模式 ①点对点模式 ②发布/订阅模式 | 衡量标准 RabbitMQ 原理初探 | 基本概念 | 工作原理 | 常用交换器 | 消费原理 | 高级特性 ①过期时间 ②消息确认 ③持久化 ④死信队列 ⑤延迟队列 | 特性分析 RabbitMQ 环境搭建 Rabbi…

完美完全卸载Oracle 11g数据库

Oracle 11g可在开始菜单中卸载&#xff0c;然后同时需要删除注册表中相关内容。 操作系统&#xff1a;windows10专业版。 卸载步骤&#xff1a; 1、停用oracle服务&#xff1a;进入计算机管理&#xff0c;在服务中&#xff0c;找到oracle开头的所有服务&#xff0c;右击选择停止…

【LeetCode】链表精选11题

目录 快慢指针&#xff1a; 1. 相交链表&#xff08;简单&#xff09; 2. 环形链表&#xff08;简单&#xff09; 3. 快乐数&#xff08;简单&#xff09; 4. 环形链表 II&#xff08;中等&#xff09; 5. 删除链表的倒数第 N 个节点&#xff08;中等&#xff09; 递归迭…

20172304 2017-2018-2 《程序设计与数据结构》第六周学习总结

20172304 2017-2018-2 《程序设计与数据结构》第六周学习总结 教材学习内容总结 本周学习了数组。 首先是数组元素&#xff0c;数组具有优越性因为它可以声明一个能容纳多个可访问值的变量。数组的数据具有索引而且是从零开始的。 其次是声明和使用数组&#xff0c;可以用“…

使用 K8spacket 和 Grafana 对 K8S 的 TCP 数据包流量可视化

前言如何知道 K8S 集群内 Pod 之间建立了哪些 TCP 连接&#xff1f;集群之间存在哪些调用关系&#xff1f;使用 k8spacket 和Grafana&#xff0c;你可以可视化集群中的 TCP 流量。了解工作负载如何相互通信&#xff0c;以及建立了多少连接&#xff0c;交换了多少字节&#xff0…

粒子系统(一):从零开始画一颗树

准备 IDE&#xff1a;VisualStudio 2017 Language&#xff1a;VB.NET / TypeScript 图形API&#xff1a;Win2D Github&#xff1a;[ UWP ] [ TypeScript ] 本文将向你介绍一种粒子系统&#xff08;Particle System&#xff09;模拟植物的简单方法。 第一节 移动 粒子按照某种规…