还在用Electron?C# + .NET MAUI + Blazor才是未来桌面开发的正确打开方式

Blazor加Electron 学习 Electron.NET 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar 阅读详情

第一章:.NET MAUI + Blazor 桌面开发的全新范式

.NET MAUI 与 Blazor 的结合标志着桌面应用开发进入了一个现代化、高效且统一的新阶段。开发者可以使用 C# 和 Razor 语法构建跨平台桌面应用,无需深入掌握原生 UI 框架或 JavaScript 生态,极大降低了技术门槛并提升了开发效率。

统一的开发体验

借助 .NET MAUI 作为原生界面容器,Blazor 能够以 Web 技术栈驱动桌面 UI 渲染。这种模式允许前端逻辑与后端服务共享代码库,实现真正的全栈 C# 开发。

项目结构配置

创建一个支持 Blazor 的 .NET MAUI 应用需在项目文件中启用相关配置:

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-windows10.0.19041</TargetFrameworks>
    <UseMaui>true</UseMaui>
    <SingleProject>true</SingleProject>
    <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
    <BlazorWebRenderer>BlazorWebView</BlazorWebRenderer> 
  </PropertyGroup>
</Project>

上述配置启用了 BlazorWebView 组件,使得在 MAUI 页面中嵌入 Razor 内容成为可能。

集成 Blazor 到页面

在 MAUI 页面中通过 BlazorWebView 控件加载 Razor 组件:

// MainPage.xaml.cs
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        var blazorWebView = new BlazorWebView { HostPage = "wwwroot/index.html" };
        blazorWebView.Services = ((App)Application.Current).Services;
        blazorWebView.RootComponents.Add<Counter>("app"); // 挂载 Counter 组件
        Content = blazorWebView;
    }
}

优势对比

特性传统 WinForms/WPF.NET MAUI + Blazor
跨平台支持仅限 WindowsWindows、macOS、Android、iOS
UI 开发语言C# + XAMLRazor (C# + HTML)
前后端共享逻辑有限高度共享

第二章:环境搭建与项目初始化

2.1 安装 .NET SDK 与开发工具链

在开始构建 .NET 应用之前,需正确安装 .NET SDK 及配套开发工具。官方 SDK 包含运行时、编译器和核心工具链,支持跨平台开发。
下载与安装步骤
前往 [.NET 官方网站](https://dotnet.microsoft.com/download) 下载适用于操作系统的 SDK 版本。推荐使用长期支持(LTS)版本以确保稳定性。
  • Windows 用户可运行.exe安装程序并按向导完成配置
  • macOS 用户可通过 Homebrew 执行:
    brew install dotnet-sdk
  • Linux 用户参考发行版指令,如 Ubuntu 使用 apt 添加仓库后安装
验证安装结果
安装完成后,终端执行以下命令检查环境是否就绪:
dotnet --version
该命令输出当前 SDK 版本号,例如 8.0.100,表明安装成功。若提示命令未找到,请检查系统 PATH 环境变量是否包含 .NET 安装路径。

2.2 创建首个 .NET MAUI Blazor 桌面应用

在完成开发环境配置后,即可创建首个 .NET MAUI Blazor 桌面应用。使用命令行执行以下指令:
dotnet new maui-blazor -n MyFirstMauiBlazorApp
cd MyFirstMauiBlazorApp
dotnet run
该命令基于官方模板生成项目结构,包含共享的 Razor 组件与平台特定的原生资源。其中,`wwwroot` 存放静态资源,`Pages` 目录管理页面组件,`Program.cs` 配置依赖注入与服务宿主。
项目结构解析
关键目录包括:
  • Pages/:存放 .razor 页面组件
  • Shared/:布局与通用 UI 组件
  • Platforms/:各平台(如 Windows)原生代码入口
启动后,Blazor WebView 将在桌面窗口中渲染 Web UI,实现跨平台一致体验。

2.3 跨平台目标配置(Windows、macOS、Linux)

在构建跨平台应用时,需针对不同操作系统进行编译目标配置。Go语言通过环境变量 GOOS 和 GOARCH 实现平台指定。
常用目标平台配置
  • Windows: GOOS=windows GOARCH=amd64
  • macOS: GOOS=darwin GOARCH=arm64(M系列芯片)或 amd64
  • Linux: GOOS=linux GOARCH=amd64
交叉编译示例
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
GOOS=darwin GOARCH=arm64 go build -o app-mac main.go
上述命令分别生成Windows可执行文件和macOS ARM64架构二进制文件。环境变量控制目标系统与处理器架构,无需依赖目标平台即可完成编译。

2.4 项目结构解析与核心文件说明

现代Go项目遵循清晰的目录分层,便于维护与扩展。典型的结构包含cmd/、internal/、pkg/、config/等目录。
核心目录说明
  • cmd/:存放程序入口,如main.go
  • internal/:私有业务逻辑,禁止外部导入
  • pkg/:可复用的公共组件
  • config/:配置文件与环境变量加载
主程序入口示例
package main

import "example/internal/app"

func main() {
    app.Start() // 启动应用服务
}
该main.go仅调用启动函数,实现关注点分离。通过引入internal/app模块,解耦初始化逻辑,提升可测试性。
配置文件结构
文件用途
config.yaml默认配置
.env本地环境变量

2.5 调试与热重载实战技巧

在现代开发流程中,高效的调试与热重载能力显著提升迭代速度。合理利用工具链功能,可实现代码变更后即时反馈,减少重启开销。
启用热重载的典型配置
以 Go 语言为例,使用 air 作为热重载工具:
// air.conf
root = "."
tmp_dir = "tmp"
[build]
cmd = "go build -o ./tmp/main main.go"
该配置指定项目根目录、临时文件路径及构建命令,air 监听文件变化并自动编译运行。
调试常见问题排查
  • 热重载未触发:检查文件监听路径是否包含子目录
  • 端口占用:确保旧进程被正确终止
  • 环境变量丢失:在自动化脚本中显式加载 .env 文件
结合 IDE 调试器与热重载,可在不中断服务的前提下修复逻辑错误,大幅提升开发体验。

第三章:核心技术融合原理

3.1 Blazor Web UI 在桌面端的集成机制

Blazor Web UI 通过 WebView2 控件在桌面端实现深度集成,利用 Chromium 内核渲染 Razor 组件,使 Web 技术栈可直接运行于本地进程。
核心集成方式
使用 Microsoft.Web.WebView2.WinForms 或 WPF 中的 WebView2 控件加载 Blazor 应用的入口页面(如 index.html),并通过注册自定义协议(如 blazor://)拦截资源请求。

webView.CoreWebView2.AddWebResourceRequestedFilter("blazor://*", CoreWebView2WebResourceContext.All);
webView.CoreWebView2.WebResourceRequested += (sender, args) =>
{
    var response = GetEmbeddedResource(args.Request.Uri);
    args.Response = response; // 返回内嵌静态资源
};
上述代码将 Blazor 的静态资源(如 _framework 目录下文件)通过 C# 后端从程序集内嵌资源中读取并响应,确保离线运行能力。
双向通信机制
通过 JS Invokable 方法和 InvokeAsync 实现 .NET 与 JavaScript 的互操作,支持桌面 API 调用(如文件系统、硬件设备)。

3.2 .NET MAUI 如何承载 Blazor 组件

.NET MAUI 通过集成 BlazorWebView 控件实现对 Blazor 组件的原生承载,使开发者能在移动应用中直接运行 Razor 组件。
BlazorWebView 集成方式
在 .NET MAUI 页面中,通过 XAML 或代码方式添加 BlazorWebView:
<BlazorWebView HostPage="wwwroot/index.html">
    <BlazorWebView.RootComponents>
        <RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
    </BlazorWebView.RootComponents>
</BlazorWebView>
上述代码中,HostPage 指定静态资源入口,RootComponents 将 Blazor 组件挂载到指定 DOM 容器(如 #app),实现组件渲染。
运行机制解析
  • BlazorWebView 内嵌 WebView 控件,并注入 .NET 运行时
  • Razor 组件在原生线程中编译并执行,通过 JavaScript 互操作与前端通信
  • UI 更新由 Blazor 渲染树驱动,自动同步至 WebView 视图层
该机制实现了跨平台 UI 逻辑复用,同时保持原生应用的部署形态。

3.3 前后端通信模型与状态管理策略

数据同步机制
现代Web应用普遍采用RESTful API或GraphQL实现前后端通信。REST通过HTTP动词映射资源操作,而GraphQL允许客户端精确查询所需字段,减少冗余传输。
  1. REST:结构清晰,易于缓存,适合资源型接口
  2. GraphQL:灵活高效,降低多端适配成本
前端状态管理方案
复杂应用需借助状态管理库统一维护全局状态。Redux通过单一store和不可变更新保障状态可预测:

const reducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { ...state, count: state.count + 1 };
    default:
      return state;
  }
};
上述代码定义了一个计数器reducer,每次派发'INCREMENT'动作时生成新状态对象,确保状态变更可追溯。结合中间件如Redux Thunk,可处理异步通信逻辑,实现与后端API的解耦交互。

第四章:功能实现与性能优化

4.1 使用 Razor 组件构建响应式用户界面

Razor 组件是 Blazor 框架中的核心构建单元,允许开发者通过 C# 和 HTML 的混合语法创建可复用、自包含的 UI 元素。组件天然支持响应式更新机制,当状态变化时自动重新渲染。
组件基本结构
@* Counter.razor *@
<h3>当前计数:@currentCount</h3>
<button class="btn btn-primary" @onclick="Increment">+1</button>

@code {
    private int currentCount = 0;

    private void Increment()
    {
        currentCount++;
    }
}
上述代码定义了一个简单的计数器组件。@code 块中封装了字段与事件处理逻辑,@onclick 绑定点击事件,触发状态变更后框架自动刷新 UI。
响应式数据绑定
  • 使用 @bind 实现双向绑定,如表单输入场景
  • 级联参数(CascadingParameter)支持跨组件传递上下文
  • 状态通知机制确保依赖组件及时更新

4.2 调用原生 API 实现系统级功能(文件、通知等)

在跨平台开发中,访问系统级功能如文件存储和本地通知,往往需要通过调用原生 API 来实现。Flutter 和 React Native 等框架提供了平台通道(Platform Channel)机制,允许 Dart 或 JavaScript 代码与 Android/iOS 原生代码通信。
文件操作示例(Android Kotlin)

// Kotlin:写入文本到内部存储
val file = File(context.filesDir, "log.txt")
file.writeText("App launched at ${Date()}")
该代码将日志字符串写入应用私有目录,filesDir 是系统分配的内部存储路径,无需额外权限,适用于小型应用数据持久化。
本地通知实现流程
  1. 在 AndroidManifest.xml 中注册通知权限
  2. 创建 NotificationChannel(Android 8.0+)
  3. 使用 NotificationManager 发送通知实例
通过原生 API 可精确控制通知样式、声音、优先级等行为,提升用户交互体验。

4.3 数据绑定与服务注入的最佳实践

响应式数据绑定策略
在现代前端框架中,应优先使用响应式系统自动追踪依赖。例如,在 Vue 中通过 ref 和 reactive 创建响应式数据:
const state = reactive({
  count: 0,
  message: computed(() => `当前值:${state.count}`)
});
上述代码中,reactive 创建嵌套响应式对象,computed 自动追踪 count 变化并缓存结果,避免重复计算。
服务注入的模块化设计
使用依赖注入(DI)容器管理服务实例,提升可测试性与复用性。推荐采用类装饰器或工厂函数注册服务:
  • 避免在组件内直接实例化服务
  • 通过接口抽象服务契约,解耦具体实现
  • 在根作用域注册单例服务,防止重复创建

4.4 打包体积压缩与启动性能调优

在现代前端应用中,打包体积直接影响页面加载速度和首屏渲染性能。通过代码分割(Code Splitting)和懒加载机制,可有效减少初始包大小。
启用生产环境压缩
使用 Webpack 时,TerserPlugin 可压缩 JavaScript 代码:

const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin({
      terserOptions: {
        compress: { drop_console: true }, // 去除 console
      },
    })],
  },
};
该配置在生产环境下移除调试语句,显著减小输出文件体积。
资源分层与缓存策略
将依赖库与业务代码分离,提升浏览器缓存利用率:
  • vendor:第三方库单独打包
  • runtime:运行时清单独立输出
  • 使用 contenthash 实现长期缓存

第五章:从 Electron 迁移到 .NET MAUI + Blazor 的路径思考

迁移动因与架构对比
企业级桌面应用面临性能瓶颈和资源占用过高问题。某金融数据分析工具原基于 Electron 构建,内存占用常超 800MB。迁移到 .NET MAUI + Blazor 后,启动时间缩短 40%,内存峰值控制在 300MB 以内。核心优势在于原生渲染与共享代码库的结合。
渐进式迁移策略
采用分阶段迁移路径:
  • 第一阶段:将现有 Web UI 封装为 Blazor 组件库
  • 第二阶段:构建 .NET MAUI 主机项目,嵌入 Blazor Hybrid 页面
  • 第三阶段:逐步替换 Electron 原生模块为 .NET MAUI 平台服务
关键代码集成示例
在 .NET MAUI 中注册 Blazor 服务:
public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        MainPage = new MainPage();

        var builder = MauiApp.CreateBuilder();
        builder
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            })
            .AddBlazorWebViewDeveloperTools()
            .Services.AddBlazorWebView();
    }
}
平台能力调用对照表
功能Electron 实现.NET MAUI 替代方案
文件系统访问fs 模块System.IO + Permissions
系统托盘Tray API第三方库如 CommunityToolkit.Maui.Notifications
本地数据库SQLite + node-sqlite3SQLCipher + SQLitePCLRaw
性能优化实践
启用 AOT 编译显著提升运行效率:
<PropertyGroup>
  <RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
同时使用 IL Trimming 减少发布包体积,最终安装包从 120MB 降至 68MB。
MAUI+Blazor:windows 打包踩坑 最近打算研究一下MAUI+Blazor,争取在今年年底之前彻底搞懂MAUI+Blazor的安装模式,微软不愧是“懒人开发”,版本自动更新啥的都给你设置好了,只不过你要按照他的要求来。 阅读详情

相关推荐

跨平台客户端Blazor方案尝试

NetCore 跨平台客户端方案,采用Electron/MAUI + Blazor(AntDesgin blazor),一步步配置、开发使用以及其中遇到问题。

yinyunpan68的专栏 567

Blazor Hybrid / MAUI 简介和实战

使用 C# 建立一套用 Blazor 技术的单个共享代码库, HTML 和 CSS的交互式 UI, 可以直接生成多端应用程序 APP

alex_zoucn的博客 7704

.NET与Electron融合:跨平台桌面开发实战指南

跨平台桌面开发是当前企业应用的重要需求,传统方案往往需要维护多套代码库。Electron作为基于Chromium和Node.js的框架,提供了成熟的跨平台渲染能力,而.NET则以其强大的后端处理能力著称。通过Electron.NET技术栈,开发者可以巧妙地将两者结合:主进程由Electron处理窗口管理等系统级操作,渲染进程则运行.NET代码,通过WebSocket实现进程间通信。这种架构既保留了.NET的性能优势,又获得了Electron的跨平台特性,特别适合医疗、金融等行业需要兼顾多平台一致性和计算性能

weixin_32822843的博客 219

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

`.NET MAUI,全称.NET Multi-platform App UI` 顾名思义,就是跨平台UI框架。使用.NET MAUI,**理论**上使用一套代码就可以开发出可运行在 Android、iOS、macOS 和 Windows 上的应用

What If... 4533

Avalonia与.NET MAUI跨平台开发实战解析

跨平台开发框架通过统一API和渲染引擎解决多平台适配难题。Avalonia作为基于Skia的跨平台UI框架,通过与.NET MAUI的深度整合,实现了Linux桌面和WebAssembly环境的原生支持。这种技术组合让开发者能够使用熟悉的XAML和C#工具链,构建在Ubuntu、树莓派甚至浏览器中流畅运行的应用程序。在工程实践中,该方案显著提升了渲染性能并降低了内存消耗,特别适合需要部署到异构环境的企业级应用。通过Avalonia的Skia渲染引擎和MAUI的跨平台API,开发者现在可以更高效地实现工业控制

congjukun0600的博客 356

使用Blazor开发桌面应用程序(.NET)

Blazor桌面应用程序的开发依赖于Electron.NET,它是一个将Blazor应用程序打包为可在桌面上运行的Electron应用程序的工具。Blazor桌面应用程序的开发依赖于Electron.NET,它是一个将Blazor应用程序打包为可在桌面上运行的Electron应用程序的工具。这将在Blazor应用程序的根目录中创建一个"electronnet"文件夹,并在其中生成Electron.NET的配置文件。在完成Blazor应用程序和Electron.NET的配置后,我们可以构建和运行应用程序。

library_git106的博客 2194

告别Electron!C# + .NET MAUI 9.0 + Blazor Hybrid性能提升300%的秘密

告别Electron臃肿架构,掌握C#实现跨平台桌面应用(.NET MAUI 9.0+Blazor Hybrid)新方案。融合原生性能与Web开发效率,适用于Windows、macOS、Linux应用开发,启动速度提升300%,资源占用降低。构建高性能混合应用的首选技术,值得收藏。

CodeIsle的博客 859

blazor-electron-app:使用Electron在跨平台桌面应用程序上探索Syncfusion Blazor组件

Electron上的Syncfusion Blazor服务器端应用程序 先决条件 • 或 • 运行应用程序 打开命令提示符,并使用以下命令行克隆存储库。 git clone https://github.com/SyncfusionExamples/blazor-electron-app 导航到应用程序文件夹,然后使用以下命令行运行该应用程序。 cd blazor-electron-app dotnet electronize start 该应用程序将在Electron Shell上启动。

C#还能这样玩?揭秘Blazor Hybrid在桌面端的惊人潜力

轻松构建跨平台桌面应用,C# 实现跨平台桌面应用(.NET MAUI 9.0+Blazor Hybrid)提供全新方案。适用于Windows、macOS和Linux,融合Web开发体验与原生性能,用HTML/CSS构建界面,共享业务逻辑代码。开发高效、维护简单,值得收藏。

FuncFun的博客 686

CANoe信号传输故障排查指南

本文提供了全面的CANoe信号传输故障排查指南,涵盖从硬件连接、通道配置到软件脚本与数据库加载的全链路诊断。针对常见的通道指示灯不亮、信号无法发送及ECU握手失败等问题,给出了基于CANoe工具和CAPL脚本的详细排查步骤与解决方案,帮助工程师系统化定位并解决实车测试中的通信故障。

ice55的博客 257

从零到一:OptimizePI Pre-layout PDN前仿真实战指南

本文详细介绍了如何使用OptimizePI进行电源完整性(PDN)前仿真,从软件安装配置到元器件建模、去耦电容配置及仿真参数设置,提供了实战技巧和常见问题排查指南。通过OptimizePI的Pre-layout仿真,工程师可以在PCB布局前优化电源分配网络,显著提升设计效率并降低成本。

weixin_28304023的博客 505

WinForm、WPF、MAUI、Blazor,考虑哪些因素?

纯个人观点:现在用.net还在开发桌面程序的,基本上都在工业和制造业领域. 这种环境下面,基本上不分啥前端后端, 都是一个人从头干到尾.选自己熟悉的技术就行.如果要注重界面开发就要抛开.net这个大环境看, 比如现在微软主推的MAUI, 还有WebView2, Electron, QT等.另外既然考虑界面了,大多数情况下可以选择Web方式. 可以服务端和设备通信,或者Web和桌面混合开发.现在还有...

dotNET跨平台 884

从圆形到椭圆:CenterNet中高斯热图半径的自适应优化策略

本文深入探讨了CenterNet目标检测模型中高斯热图生成策略的优化,针对传统圆形高斯核在处理长宽比差异大目标时的局限性,提出了自适应椭圆高斯核的解决方案。通过数学推导和代码实战,详细阐述了如何根据目标边界框尺寸动态计算椭圆长短轴半径,生成更贴合目标几何形状的热图监督信号,从而有效提升模型,尤其是对无人机、车辆等不规则目标的定位精度。

alice7model的博客 985

Blazor跨平台开发:一次编写,多平台运行

Blazor是一个由微软开发的开源Web框架,它允许开发者使用C#和.NET构建交互式Web应用程序,实现了"一次编写,多平台运行"的跨平台开发目标。通过Blazor,开发者可以使用熟悉的C#语言和.NET生态系统来构建现代Web应用,无需切换到JavaScript。 ## 什么是Blazor? Blazor是一个使用.NET构建交互式Web UI的框架。它允许开发者使用C#而不是JavaSc

gitblog_00102的博客 380

[ESP32S3N16R8][LVGL8.3.0][IDF5.2.3]ST7701S RGB屏幕驱动[vscode最详细配置]

ST7701S ESP32S3 基于ESP-IDF5.2.3编写,编程环境为vscode。本教程详细讲述了esp32s3配置st7701s屏幕驱动以及gt911触摸驱动并关联到lvgl8.3.0,使用IDF5.23示例rgb_panel进行测试删除了其里面的屏幕驱动,改为单独编写屏幕和触摸驱动,最后完成了实列。

qq_44022379的博客 2604

PMBus协议解析:基于I2C的电源管理实战与TMS320F28003x驱动开发

在嵌入式系统与服务器电源设计中,数字电源管理总线是实现高效、可靠电源监控与控制的关键技术。PMBus协议基于广泛应用的I2C总线物理层,通过定义标准化的命令集、数据格式与时序规范,为多路电源的电压电流监控、动态调整及故障处理提供了高效解决方案。其技术价值在于通过硬件自动处理协议解析、时钟拉伸与中断,显著降低软件复杂度,使开发者能聚焦于电源环路设计等核心逻辑。该协议广泛应用于服务器、通信基站及高性能计算板卡等场景,通过引入数据包错误检查、专用告警线等机制,确保了电源管理的可靠性。本文以TI TMS320F28

weixin_29189377的博客 374

net core开发跨平台的桌面应用,如上位机很实用

Electron.NET基于Electron框架,本质上是一个封装了Web应用的桌面应用,可能会存在性能瓶颈,特别是在处理大量数据或复杂计算时。:与.NET Core和.NET Framework相比,Avalonia的生态系统相对较小,可用的第三方库和工具较少。:对于熟悉.NET和C#的开发者来说,可以直接使用现有的.NET知识和技能进行开发,无需额外学习复杂的前端技术。:作为.NET框架的一部分,MAUI可以充分利用.NET丰富的类库和工具,方便进行数据处理、业务逻辑开发等。

zzlyx99的专栏 1018

科技英语/专业英语——改错总结【2】

1.固定句式 make it + adj + 句子 例:These features make the electronic systems difficult to intercept this kind of signal. 正确形式:These features make it  difficult for the electronic systems  to intercept

MISAYAONE的博客 1731

桌面应用程序开发:跨平台方案方案有什么?

通过以上方案和实践,开发者可以有效地进行跨平台桌面应用开发,提供高质量的跨平台桌面应用。跨平台开发是指在多个操作系统上运行相同代码的能力。

AI知识分享,技术知识分享 4726

2️⃣ Coze创建智能体教学(2025年全新版本)

扣子平台提供强大支持,可将智能体轻松集成至各类社交平台,使智能体得以服务更为庞大的用户群体。当下支持集成的平台如下:​1️⃣豆包:作为聚焦 AI 内容创作的平台,非常适合发布充满创意、娱乐性强的智能体。​2️⃣飞书:适合发布用于办公协作的智能体,助力团队提升工作效率。​3️⃣微信:借助公众号或小程序的形式,能够服务海量微信用户。​4️⃣抖音:适合发布与短视频相关的智能体,为用户提供创意与娱乐服务。​

李同学Lino的博客 4574

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2583

mmdetection Soft Teacher:用 10% 标注数据训练物体检测器

mmdetection 的 Soft Teacher 是内置的半监督目标检测框架:教师模型对未标注图片产出伪标签,学生模型跟着学,10% 的标注数据也能训出可用的检测器。 ## 标注的代价:半监督检测要解决的真问题 💸 COCO train2017 有 11.8 万张图、250 万个框,人工标注这种规模代价极高。落到医疗影像、工业质检这类垂直领域,预算通常只够标一小部分图,剩下大量原始图像只

gitblog_00112的博客 269

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ay的C#8.0和net5高级编程笔记1-C#与.NET入门

Photino是一个开源项目,允许开发人员将WEB UI放在桌面应用程序上。了解如何使用HTML和您最喜欢的JavaScript构建在Windows,Linux和Mac上运行的应用程序框架和/或Blazor(用于用户界面),以及.NET 5(其余)。什么是Photino?如果您熟悉Electron或Electron应用程序(VS代码,Slack,Azure Data Studio,Azure存储资源管理器,Evernote ...)…Photino还是一个开放源代码项目,允许开发人员使用。

茗洋AaronYang 655

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华硕游戏本长期插电能防电池鼓包吗?G-Helper 3 步锁好 80% 充电上限

笔记本全天插着电,电池停在 100% 一个把月,哪天掀开 lid 发现屏幕被顶起一层?别急着怀疑电池坏了——多数是长期高电量占用的习惯问题。G-Helper 3 步就能把充电线锁在 80%,全程不用碰官方套件。 ## 免安装无后台:G-Helper 比官方套件轻在哪 G-Helper 是 Armoury Crate(华硕官方硬件控制套件)的轻量替代:单个 EXE,不安装、无常驻后台,只调用机器

gitblog_00498的博客 700

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Blazor Hybrid桌面/Web统一部署难题破解:Electron替代方案已上线,3个未公开的MAUI+Blazor Native Bridge技巧

破解Blazor Hybrid跨平台统一部署难题,提供MAUI+Blazor Native Bridge三大实战技巧。适用于桌面/Web一体化场景,提升C# Blazor 2026现代Web开发趋势下的生产环境部署效率与稳定性。轻量、原生交互、单代码库维护——值得收藏

Algorift的博客 203

【亲测免费】 BlazorMobile 项目教程

BlazorMobile 项目教程 1、项目介绍 BlazorMobile 是一个基于 Nuget 包和项目模板的解决方案,允许开发者将 Blazor Web 应用嵌入到 Xamarin 应用中,从而实现移动应用的本地化。该项目与 .NET Core 3.1 兼容,支持 iOS、Android、UWP 和桌面平台。BlazorMobile 的主要优势在于它允许开发者使用 C# 和 .NET 构建跨...

gitblog_01171的博客 897
上一篇: ASP.NET Core 9最小API完全指南(仅限高级开发者掌握的路由内幕)
下一篇: 揭秘Symfony 7服务容器黑科技:如何提升应用性能300%?
LearnFlow
博客等级 码龄1年 150粉丝 2113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值