[MAUI] 在.NET MAUI中结合Vue实现混合开发

避坑,c#开发人员学习开发app时.NET MAUI和Vue3 选择 适合需要高性能原生应用、已有C#技术积累、或需快速迭代企业级应用(如内部工具、数据采集App)的场景。典型案例:跨平台办公软件、物联网设备控制端。适合轻量级应用、偏好Web技术栈、或需高度定制UI(如电商、社交类App)。经过一段时间学习vue3后才发现作为一个C#背景的开发人员从开发效率、调试便捷性、部署便利性考虑,建议优先尝试.NET MAUI,若项目需求偏向Web或已有Vue3经验,再考虑后者。是更合适的选择,尤其是在跨平台原生应用开发场景中。 阅读详情
AI摘要

本文详细介绍了如何在MAUI项目中嵌入Vue,实现Vue Web应用的跨平台运行,涉及资源管理、JS调用C#、C#调用JS等关键技术。重点讲述了混合开发过程和代码示例,探讨了为何选择Blazor与现有技术栈的融合策略。

在MAUI微软的官方方案是使用Blazor开发,但是当前市场大多数的Web项目使用Vue,React等技术构建,如果我们没法绕过已经积累的技术,用Blazor重写整个项目并不现实。

Vue是当前流行的web框架, 简单来说是一套模板引擎,利用“模板”和“绑定”两大特性实现web页面mvvm模式开发。利用.NET MAUI框架可以将Vue应用嵌入到Web容器中。可以实现跨平台的混合开发。

例如我在某医疗行业项目中,已经用这个混合开发的方式生成应用,Vue代码不需要做什么改动,就能跨平台运行:

如果你有一套Vue开发的网站,可以根据这篇文章,尝试移值进你的iPhone,Android以及平板电脑等移动设备。

混合开发的核心工作是构建Web与.net 的互操作,我们将利用Blazor引擎的如下功能:

  • 资源的统一管理
  • js代码的注入
  • js调用C#代码
  • C#调用js代码

如果你还不了解混合开发的概念,请回看上一章节[MAUI] 混合开发概念_jevonsflash的专栏-优快云博客https://blog.youkuaiyun.com/jevonsflash/article/details/121835547

整个工作分为MAUI部分,Vue部分和混合改造。

MAUI部分

创建Maui App项目:

你也可以创建 Maui Blazor App 项目,命名为MatoProject,但是这个模板主要围绕Blazor开发,有的功能我们并不需要,得删很多文件。

创建完成后编辑MatoProject.csproj,在Sdk最末尾加上.Razor,VS会自动安装Microsoft.AspNetCore.Components.WebView.Maui依赖包(注意不要手动Nuget添加这个包,否则程序无法运行)

 安装完成后在项目目录中创建一个wwwroot文件夹

这个文件夹将是混合开发Web部分的根目录,这个名称不能随便定义,我们看看为什么:

打开Microsoft.AspNetCore.Components.WebView.Maui.targets这个文件:

我们可以看到构建项目时,这个库会将wwwroot文件夹里的内容作为Maui资源(MauiAsset)类型设置标签,编译器则会根据MauiAsset标签将这些内容打包进各个平台的资源文件夹,具体的Maui资源类型可以参考这个文章.NET MAUI – Manage App Resources – Developer Thoughts (egvijayanand.in) ,

打开MauiProgram.cs 在builder 中注册BlazorMauiWebView组件,在服务中使用扩展方法AddBlazorWebView()来添加相关Blazor的服务

using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using Microsoft.Maui.Controls.Compatibility;
using Microsoft.Maui.Controls.Hosting;
using Microsoft.AspNetCore.Components.WebView.Maui;
using Microsoft.Extensions.DependencyInjection;

namespace MatoProject
{
	public static class MauiProgram
	{
		public static MauiApp CreateMauiApp()
		{
			var builder = MauiApp.CreateBuilder();
			builder
				.RegisterBlazorMauiWebView()
				.UseMauiApp<App>()
				.ConfigureFonts(fonts =>
				{
					fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
				});
			builder.Services.AddBlazorWebView();
			return builder.Build();
		}
	}
}

打开MainPage.xaml,编辑原生应用的主页面:

建立BlazorWebView控件铺满屏幕,并设置HostPage为Web部分的主页index.html

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MatoProject.MainPage"
             xmlns:b="clr-namespace:Microsoft.AspNetCore.Components.WebView.Maui;assembly=Microsoft.AspNetCore.Components.WebView.Maui"
             BackgroundColor="{DynamicResource SecondaryColor}">

    <Grid>
        <b:BlazorWebView HostPage="wwwroot/index.html">
            <b:BlazorWebView.RootComponents>
                <b:RootComponent Selector="#blazorapp" x:Name="MainWebView" ComponentType="{x:Type local:Index}/>
            </b:BlazorWebView.RootComponents>
        </b:BlazorWebView>
    </Grid>
</ContentPage>

建立_import.razor

@using System.Net.Http
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using MatoProject

Vue部分

至此我们建立好了原生开发的Web容器,接下来需要处理Vue项目了:

cd到项目目录,使用vue-cli创建一个空白Vue项目:

 这里可以按照Vue的编程喜好建立,比如我选择了2.0项目,支持Typescript,es6的class命名方式等,最终都要通过webpack打包成静态资源,所以无所谓。

建立src/api/fooService.ts,创建如下的函数:

window['DotNet']对象将是MAUI Blazor中注入的交互操作对象

export async function GetAll(data) {
    var result = null
        await window['DotNet'].invokeMethodAsync('MatoProject', 'GetFoo')
            .then(data => {
                console.log("DotNet method return the value:" + data);
                result = data
            });
    return result
}


export async function Add(data) {
    var result = null
        await window['DotNet'].invokeMethodAsync('MatoProject', 'Add', data)
            .then(data => {
                console.log("DotNet method return the value:" + data);
                result = data
            });
    return result
}

打开Home.vue 编辑:

这是Web的主页面,我们需要三个按钮以及相关函数,测试js与C#的交互操作。

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png" />
    <div>
      <h3>foo:</h3>
      <button @click="getFoo">click to get foo</button>
      <br />
      <span>{{ foo }}</span>
    </div>
    <div>
      <h3>bar:</h3>
      <span>{{ bar }}</span>
    </div>
    <div>
      <button @click="add">click here to add</button>
      <span>click count:{{ cnt }}</span>
    </div>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import HelloWorld from "@/components/HelloWorld.vue"; // @ is an alias to /src
import { GetAll, Add } from "@/api/fooService";

@Component({
  components: {
    HelloWorld,
  },
})
export default class Home extends Vue {
  foo: string = "";
  bar: string = "";
  cnt: number = 0;

  async created() {
    window["postBar"] = this.postBar;
  }
  async add() {
    this.cnt = await Add({ a: this.cnt, b: 1 });
  }

  async getFoo() {
    var foo = await GetAll(null);
    this.foo = foo;
  }

  async postBar(data) {
    this.bar = data;
    console.log("DotNet invocked the function with param:" + data);
    return this.bar;
  }
}
</script>

到此已经完成了一个简单的Vue项目

运行打包命令:

PS D:\Project\maui-vue-hybirddev\hybird-host> yarn build

将dist目录中的所有内容复制到wwwroot文件夹下。

混合改造

这是混合开发的重点,改造MAUI项目,以适配Vue

打开wwwroot/index.js重写为:

<!DOCTYPE html>
<html lang="">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="icon" href="favicon.ico">
    <title>hybird-host</title>
    <link href="js/about.dc8b0f2b.js" rel="prefetch">
    <link href="css/app.03043124.css" rel="preload" as="style">
    <link href="js/app.b6b5425b.js" rel="preload" as="script" crossorigin="anonymous">
    <link href="js/chunk-vendors.cf6d8f84.js" rel="preload" as="script" crossorigin="anonymous">
    <link href="css/app.03043124.css" rel="stylesheet">
</head>
<body>
    <div id="blazorapp">Loading...</div>
    <script src="_framework/blazor.webview.js" autostart="false"></script>
</body>
</html>


注意,仅全部重写body部分,不要更改head的link标签内容,仅在js后面加上crossorigin="anonymous" 以解决跨域问题。

建立Index.razor文件:

@using Microsoft.Maui.Controls
@inject IJSRuntime JSRuntime
@implements IDisposable
<noscript><strong>We're sorry but CareAtHome doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div>
@code {

    [JSInvokable]
    public static Task<string> GetFoo()
    {
        return Task.FromResult("this is foo call C# method from js");
    }

    [JSInvokable]
    public static Task<int> Add(AddInput addInput)
    {
        return Task.FromResult(addInput.a + addInput.b);
    }

    public async void Post(object o, EventArgs a)
    {
        await JSRuntime.InvokeAsync<string>("postBar", "this is bar call js method from C#");
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        ((App.Current as App).MainPage as MainPage).OnPostBar += this.Post;
        try
        {
            if (firstRender)
            {
                await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./js/chunk-vendors.cf6d8f84.js", new { crossorigin = "anonymous" });
                await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./js/app.b6b5425b.js", new { crossorigin = "anonymous" });
            }


        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

    }

    public void Dispose()
    {
        (Application.Current.MainPage as MainPage).OnPostBar -= this.Post;
    }


}

注意以下这两个语句需要对应打包生成的实际文件名,并且加上跨域标签

await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./js/chunk-vendors.cf6d8f84.js", new { crossorigin = "anonymous" });
await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./js/app.b6b5425b.js", new { crossorigin = "anonymous" });

 MainPage.xaml建立一个按钮并且设置触发事件方法:

<Button Text="Post Bar To WebView" HorizontalOptions="Center" VerticalOptions="End" HeightRequest="40" Clicked="PostBar_Clicked"></Button>

 CodeBehind:

using System;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Essentials;

namespace MatoProject
{
	public partial class MainPage : ContentPage
	{
        public event EventHandler<EventArgs> OnPostBar;

		int count = 0;

		public MainPage()
		{
			InitializeComponent();
		}

		private async void PostBar_Clicked(object sender, EventArgs args)
		{
			OnPostBar?.Invoke(this, args);
		}
	}
}

至此,所有的代码工作已经完成,在PC上可以选择Windows或者Android模拟器来运行程序

运行效果:

若在windows平台上运行,原生控件使用 Edge WebView2 呈现器加载页面, 按f12会调用原生的调试工具,在这里看到打印

 现在,可能有人会问为什么要使用这样的技术架构?明明可能有更好用的混合开发技术Ionic,React Native,Uni-app。首先不可否认这些技术都有他们的特点与优势,但当你拥有一个成熟的Xamarin框架,你可以轻松迁移到MAUI,利用EFCore实现数据持久化或者集成Abp框架来配置依赖注入,全局事件,本地化等移动开发常用的功能(将Abp移植进.NET MAUI项目(一):搭建项目_林晓lx的博客-优快云博客)。Xamarin是一个设备抽象层,提供的WebView也有较好的H5兼容性。

当然主要原因还是在快速开发上,你的代码积累才是宝贵的,更少的修改代码量才是王道,如果你在用React技术栈编写Web代码,也许React Native才是你最佳选择 。没有最优的技术,只有最适合你的技术。

项目地址

jevonsflash/maui-vue-hybirddev: maui-vue-hybirddev (github.com)

jevonsflash/maui-vue-hybirddev (gitee.com)

全栈跨平台组件vue、tauri、blazor、maui、flutter对比,rust、py微服务架构可行性分析 Element Plus是Element UI的Vue 3版本,是由饿了么团队主要提供社区支持,一套基于Vue 3的高质量组件库。特点和优势丰富的组件:Element Plus包含了大量常用的UI组件,如按钮、表单、表格、对话框等,能够满足大部分项目的需求。良好的文档和社区支持:官方文档详细,社区活跃,问题解决速度快。简洁的API设计:API设计简洁易用,开发者可以快速上手。支持国际化:内置多语言支持,可以轻松进行国际化配置。缺点组件不够齐全。 阅读详情

相关推荐

做一个高德地图的 iOS / Android .NET MAUI 控件系列 - Android 原生库绑定

.NET MAUI 绑定第三方 Android 原生 SDK 技巧

Kinfey 1936

[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发

每个BlazorWebView控件包含根组件(RootComponent)定义,ComponentType是在应用程序启动时加载页面时的类型,该类型需要继承自Microsoft.AspNetCore.Components.IComponent,由于我们的导航是由MAUI处理的,因此我们不需要使用Blazor路由,直接使用Razor组件。开发应用需要一个独立的host项目。中引入,还有一种是使用并置的js文件,这种方式是所谓的"CodeBehind",因为更利于组织代码,这里我们使用并置的js文件。

jevonsflash的专栏 3051

maui blazor开发app 试写一个简单的登陆界面

而MAUI更是能够实现跨平台开发,现在还发现了MAUI Blazor,简直就像是购买了一瓶白酒,里面还意外中了一张奖券,全都是额外赠送的好处。多年前,我在开发ASP.NET MVC时曾使用Blazor构建了一个烘手器的网站,并成功将其优化至百度搜索排名第一。pages下面有三个子页,通过分析NavMenu.razor 则点击菜单跳转到href,跳转到三个页面中的一个。wwwroot下的index.html感觉是一个WEB服务一样,这里的/表示把 定义的路由页当首页。菜单NavMenu.razor。

大白菜代码的博客 2318

基于最新的MAUI混合VUE3开发Android应用(2022-11-01)

微软MAUI框架集成VUE3开发,支持js调用C#方法

weixin_46545658的博客 5340

大模型推理中Prefill与Decode、KV Cache三者说明

Prefill 阶段对输入 Prompt 并行编码,一次性构建KV Cache,属于计算密集型任务。Decode 阶段逐 token 迭代生成,复用KV Cache避免重复计算,属于显存带宽密集型任务。KV Cache是自回归推理的核心基石,用显存换时间,实现两阶段衔接与高效生成。PD 分离通过任务解耦、异构硬件、异步调度、独立批处理,解决传统一体化推理的资源冲突与利用率低下问题,是当前云端大模型推理服务的主流工程优化方向。

a486259的博客 1489

用Python玩转农业大数据:从Landsat遥感影像到作物产量预测实战教程

本文详细介绍了如何利用Python处理Landsat遥感影像数据,并结合土壤信息构建作物产量预测模型。从环境搭建、数据预处理到模型训练与可视化,提供了一套完整的农业大数据分析实战方案,帮助读者掌握遥感影像处理和机器学习在精准农业中的应用。

weixin_30832143的博客 397

Blazor 混合开发_MAUI+Vue_WPF+Vue

在 MAUI 微软的官方方案是使用 Blazor 开发,但是当前市场大多数的 Web 项目使用 Vue、React 等技术构建,用Blazor重写整个项目并不现实。利用 .NET MAUI 框架可以将 Vue 应用嵌入到 Web 容器中,可以实现跨平台的混合开发。将 dist 文件夹下的所有文件复制到容器项目下的 wwwroot 文件夹下。Vue 是当前流行的 Web 框架, 简单来说是一套模板引擎,利用。第一个参数是容器项目的 Namespace,第二个参数是要调用的方法。导入 namespace。

视觉软件 2821

STM32基于软件模拟IIC进行AHT21B温湿度采集

通过学习软件IIC来进行实操AHT21B采集温湿度。

Liu-FE的博客 3700

[MAUI] 混合开发概念

混合开发的概念是相对与原生开发来说的:App不直接运行原生程序,而是在原生程序中运行一个Web程序,原生程序中包含Web运行时,用于承载Web页面。暂且将原生应用称之为Web容器,Web容器应该能让JavaScript代码与原生平台的代码交互,互相调用,同时为上层提供交互逻辑,例如导航,事件,Cookie,刷新等内容。 之前使用Xamarin可以利用WebView控件做混合开发,但是到目前为止WebView功能还是比较孱弱。用WebView实现混合开发主要是通过重写各个平台的自定义呈现器(Renderer

jevonsflash的专栏 3068

华为昇腾Atlas 200I DK A2实战:从开箱到运行首个AI应用

本文详细介绍了华为昇腾Atlas 200I DK A2开发板从开箱到运行首个AI应用的全过程。包括硬件准备、系统烧录、开发板连接方案、AI应用运行及性能优化技巧,帮助开发者快速上手部署AI项目,提升开发效率。

weixin_27038245的博客 591

电路板功能测试系统-FCT for PCBA

电路板功能测试系统用于电路板组件(PCBA)的功能测试(FCT),满足自动化大批量生产的要求。  ● 用户根据自己需要定义测试步骤,灵活方便  ● 适合工业自动化大批量生产应用  ● 系统测试精度高,稳定可靠   一、电路板功能测试系统概述 电路板测试过程通常由多个步骤组成,每单个步骤中需要对多个物理量(电压、电流、电阻、频率、波形等)进行测试。在每个步骤测试时

6813

[MAUI]集成高德地图组件至.NET MAUI Blazor项目

地图组件在手机App中常用地理相关业务,如查看线下门店,设置导航,或选取地址等。是一个较为常见的组件。在.NET MAUI 中,有两种方案可以集成高德地图,一种是使用原生库绑定。但这种方案需要大量平台原生开发的知识,而且需要对每一个平台进行适配。在这里我介绍第二种方案:.NET MAUI Blazor + 高德地图JS API 2.0 库的实现。JS API 2.0 是高德开放平台基于WebGL的地图组件,可以将高德地图模块集成到.NET MAUI Blazor中的BlazorWebView控件。

jevonsflash的专栏 2214

两级运算放大器设计与仿真

运算放大器(简称运放)是许多模拟系统和混合信号系统中的一个完整部分。各种不同复杂程度的运放被用来实现各种功能:从直流偏置的产生到高速放大或滤波。伴随者每一代 CMOS 工艺,由于电源电压和晶体管沟道长度的减小,为运放的设计不断提出复杂的课题。 运算放大器的设计可以分为两个较为独立的步骤,第一步是选择或搭建运放的基本结构,绘出电路结构草图,第二步就要选择直流电流,手工设计管子尺寸,以及设计补偿电路等等,然后在手工计算的基础上,运用模拟电路仿真软件对设计的两级运放进行仿真,并对电路进行后续的调试和修改。....

qq_50968231的博客 11万+

推荐一个优秀的 .NET MAUI 组件库

合集 - .NET 开源项目(9)1.推荐一款界面优雅、功能强大的 .NET + Vue 权限管理系统08-052..NET 开源权限认证项目 MiniAuth上线08-063..NET 与 LayUI 实现高效敏捷开发框架08-084..NET 8 + Blazor 多租户、模块化、DDD框架、开箱即用08-095.推荐一个优秀的 .NET MAUI 组件库08-136..NET 7 + Vue...

weixin_42524499的博客 251

ESP32S3学习——i2c,点亮0.96寸oled

ESP32S3学习——i2c,点亮0.96寸oled

HandBAI的博客 1万+

Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

3. 其他文章,还要进行驱动编译就比较复杂了(不推荐)1.树莓派+MCP2515+

pvmsmfchcs的博客 1565

从零构建跨平台桌面应用,C# + .NET MAUI 9.0实战全流程详解

掌握C#实现跨平台桌面应用(.NET MAUI 9.0+Blazor Hybrid)的完整流程,解决多平台开发效率难题。涵盖环境搭建、界面设计、前后端集成及发布部署,适用于Windows、macOS和Linux应用开发。融合Blazor Hybrid的Web与原生优势,提升开发效能,值得收藏。

PoliSeed的博客 1295

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

英雄之旅:MAUI,带有ASP.NET Core 8后端

MAUI上的“英雄之旅”,通过生成的客户端API与真正的后端对话

寒冰屋的专栏 419

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

.NET MAUI传参机制大揭秘:4个你必须掌握的高级技巧

掌握.NET MAUI导航参数传递的高效方法,解决页面间数据传递难题。涵盖查询参数、路由状态、强类型视图模型绑定等四大高级技巧,适用于复杂页面跳转场景,提升应用灵活性与可维护性,值得收藏。

LogicNest的博客 389

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

.NET开发主流框架全方位对比分析

.NET主流框架概览 ASP.NET Core是高性能跨平台Web框架,支持Razor Pages和MVC模式,适合现代Web开发。.NET MAUI取代Xamarin,用于构建跨平台原生应用,支持单一代码库多平台部署。Blazor允许使用C#开发交互式Web UI,提供服务器和WebAssembly两种托管模式。WPF仍是构建Windows桌面应用的首选,具备丰富的UI定制能力。Entity Framework Core作为主流ORM,简化数据访问并支持多种数据库。SignalR专为实时Web功能设计,自

百锦再的博客 4326

.net framework开发winform_基于.NET 5.0跨平台全栈开发福音来了

2020.11.10日DOTNET正式发布.NET 5.0,.NET 5.0 是 3.1 之后 .NET Core 的下一个主要版本,可以理解为.NET 5.0 = .net core vnext。为不叫 .NET Core 4.0 官网上描述主要有两个原因:1. 跳过了版本号 4.x 以避免与 .NET Framework 4.x 混淆;2. 从名称中删除了"Core",以强调这是 .NET 前...

weixin_39602891的博客 5691

【.NET MAUI导航栈深度解析】:掌握页面跳转与生命周期管理的核心技巧

掌握.NET MAUI导航栈管理核心技巧,轻松实现页面跳转与生命周期精准控制。适用于多页面应用开发,支持堆栈操作、页面传参与资源释放优化。提升用户体验与应用性能,值得收藏。

CompiGap的博客 805

【紧急修复】.NET MAUI中NavigationParameter未触发?这5个解决方案必须掌握

解决.NET MAUI导航参数传递失效难题,5种可靠方案汇总。涵盖页面跳转、数据序列化与QueryProperty应用,确保参数正确接收。适用于跨页面通信场景,提升开发效率,值得收藏。

ProcePerch的博客 921

学习.NET MAUI Blazor(一)、Blazor是个啥?

.NET Blazor(以下统称Blazor)是.NET Core 3.0推出的一个Web UI框架,如果对Vue比较熟悉的话,会感觉它们及其类似,毕竟嘛,现代前端框架的底层逻辑都基本一致(DOM差量更新、响应式、组件化等)。

What If... 2840

如何快速掌握MAUI跨平台开发:从零到项目部署的完整实战指南

**MAUI跨平台开发**正在成为现代应用开发的主流选择,它让开发者能够使用单一代码库构建iOS、Android、Windows和macOS应用。本文将为初学者提供一份完整的**MAUI跨平台开发实战指南**,从环境搭建到项目部署,帮助你快速掌握这项关键技术。 ## 为什么选择MAUI跨平台开发? **MAUI(.NET Multi-platform App UI)** 是微软推出的下一代跨平

gitblog_00231的博客 782
上一篇: [MAUI] 混合开发概念
下一篇: [学习笔记]Linux环境下部署 .Net5 程序
林晓lx
林晓lx 2017年优快云移动跨平台大赛优秀奖获得者 2017年优快云移动跨平台大赛优秀奖获得者
博客等级 码龄15年 3761粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林晓lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值