C#想要实现Electron那样混合桌面程序可以用以下几个库.
本文使用EdgeSharp

开始

EdgeSharp可以直接使用HTML,

也可以配合Blazor、Razor 、SolidJs、Svelte、React、Vue、Angular等前端框架。

直接调用系统中Edge浏览器所配套的 WebView2,

无需像Electron那样打包整个浏览器内核,打包后的文件非常小。

更多强大的功能可以查看官方示例,本文只使用了最简单的HTML

EdgeSharp.Samples/angular-react-vue

EdgeSharp.Samples/winform

EdgeSharp.Samples/wpf

创建一个Winform程序

创建后,删除其他文件,只保留 Program.cs

Nuget安装相关依赖

    <PackageReference Include="EdgeSharp.Core" Version="0.9.0" />
<PackageReference Include="EdgeSharp.WinForms" Version="0.9.0" />

将下面代码放入Program.cs中

using System.ComponentModel;
using System.Windows.Forms; using EdgeSharp.Core;
using EdgeSharp.Core.Configuration;
using EdgeSharp.Core.Defaults;
using EdgeSharp.Core.Infrastructure;
using EdgeSharp.WinForms; using HelloEdgeSharp.Controller; using Microsoft.Extensions.DependencyInjection; namespace HelloEdgeSharp
{
internal static class Program
{ [STAThread]
static void Main()
{
try
{
Application.SetHighDpiMode(System.Windows.Forms.HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); var appBuilder = new AppBuilder<Startup>();
ServiceLocator.Bootstrap(appBuilder);
var bowserForm = (BrowserForm)ServiceLocator.Current.GetInstance<IBrowserWindow>();
Application.Run(bowserForm);
appBuilder?.Stop();
}
catch (Exception e)
{ MessageBox.Show(e.Message);
} }
} public class Startup : WinFormsStartup
{
public override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services); services.AddSingleton<IConfiguration, SampleConfig>(); services.AddSingleton<IBrowserWindow, SampleBrowserForm>(); // 注入 控制器
RegisterActionControllerAssembly(services, typeof(HelloController).Assembly);
} public override void Initialize(IServiceProvider serviceProvider)
{
base.Initialize(serviceProvider);
}
} internal class SampleConfig : Configuration
{
public SampleConfig() : base()
{
// 拦截 api 并导航到 Controller (用RegisterActionControllerAssembly注册控制器)
UrlSchemes.Add(new("http", "api", null, UrlSchemeType.ResourceRequest));
// 静态文件资源 拦截 导航到 wwwroot
UrlSchemes.Add(new("http", "app", "wwwroot", UrlSchemeType.HostToFolder)); // 设置 首页地址
StartUrl = "http://app/index.html"; ; // 去掉窗口标题栏
//WindowOptions.Borderless = true; }
} internal class SampleBrowserForm : BrowserForm
{ public SampleBrowserForm()
{
Width = 1200;
Height = 900; var executable = System.Reflection.Assembly.GetExecutingAssembly();
var iconStream = executable.GetManifestResourceStream("EdgeSharp.WinForms.Sample.edgesharp.ico");
if (iconStream != null)
{
Icon = new Icon(iconStream);
}
} // 可以重写 各种生命周期
protected override void Bootstrap()
{
base.Bootstrap();
} protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
}
}
}

新建 Controller/HelloController.cs

继承 ActionController , 并添加 ActionController , ActionRoute 两个特性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using EdgeSharp.Core.Network; namespace HelloEdgeSharp.Controller
{
[ActionController(Name = "HelloController", Description = "测试控制器")]
public class HelloController : ActionController
{ public class UserInfo
{
public int Id { get; set; }
public string Name { get; set; }
public string Version { get; set; }
public string Url { get; set; }
}
public class Result<T>
{
public bool Succeeded { get; set; } public T Data { get; set; }
public string Errors { get; set; }
} [ActionRoute(Path = "/getFrameWorks")]
public Result<object> GetFrameWorks(int index, int size)
{
var list = new List<UserInfo>
{
new UserInfo()
{
Id = 1, Name = "React",
Version = "v1",
Url = "http://www.react.com",
},
new UserInfo()
{
Id = 2,
Name = "Vue",
Version="v2",
Url = "http://www.vue.com",
}
}; return new Result<object>
{
Succeeded = true,
Data = new
{
Items = list,
TotalCount = 100,
}
};
} }
}

新建 wwwroot/index.html

html代码省略
这里是Js发起请求与C#交互的关键代码

// 在C# SampleConfig 中配置了UrlSchemeType.ResourceRequest,
// 会拦截这个域名 http://api/ 的请求
let instance = axios.create({
baseURL: "http://api/",
timeout: 15000,
});
// 发起get请求
instance.get("/getFrameWorks?index=1&size=2")
.then(r => {
// 成功拿到controller中返回的数据
console.log(r)
})

运行项目

这样我们就得到了一个使用HTML作为页面,C#作为后端的桌面程序

Github地址

全部源码

C#使用WebView2替代Electron的更多相关文章

  1. 微软要放弃Electron了???聊聊WebView2

    有好几个公众号发文说"微软要放弃Electron了",实际情况是微软旗下的Teams产品打算把Electron框架换成WebView2而已.接下来我就聊一下这个事情: 微软不会放弃 ...

  2. 放弃 Electron,拥抱 WebView2!JavaScript 快速开发独立 EXE 程序

    Electron 不错,但也不是完美的. Electron 带来了很多优秀的桌面软件,但并不一定总是适合我们的需求. 多个选择总是好事! 我使用 Electron 遇到的一些麻烦 1.Electron ...

  3. 使用 AngularJS 和 Electron 构建桌面应用

    GitHub 的 Electron 框架(以前叫做 Atom Shell)允许你使用 HTML, CSS 和 JavaScript 编写跨平台的桌面应用.它是io.js 运行时的衍生,专注于桌面应用而 ...

  4. Electron开发环境部署

    Electron开发环境部署 安装node.js 可以从node.js官方网站上获取安装包,并进行安装,安装完可以通过 ndoe -v 指令进行版本查看. 本文的开发环境为node.js 4.4.5. ...

  5. AngularJS 和 Electron 构建桌面应用

    译]使用 AngularJS 和 Electron 构建桌面应用 原文: Creating Desktop Applications With AngularJS and GitHub Electro ...

  6. Electron与jQuery中$符号冲突的三种解决方法

    在Electron工程中引用jQuery时,经常会出现以下错误: Uncaught ReferenceError: $ is not defined 解决的具体方法如下: ①.在测试的过程中(测试过1 ...

  7. 第二章 你第首个Electron应用 | Electron in Action(中译)

    本章主要内容 构建并启动Electron应用 生成package.json,配置成Electron应用 在你的项目中包含预先构建Electron版本 配置package.json以启动主进程 从主进程 ...

  8. 从零开始学Electron笔记(五)

    在之前的文章我们介绍了一下Electron的右键菜单的制作,接下来我们继续说一下Electron如何通过链接打开浏览器和嵌入网页. 现在有这样一个需求,我们要在我们的软件中加一个链接,然后点击该链接打 ...

  9. Electron入门指北

    最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...

  10. 基于vue3.0+electron新开窗口|Electron多开窗体|父子模态窗口

    最近一直在折腾Vue3+Electron技术结合的实践,今天就来分享一些vue3.x和electron实现开启多窗口功能. 开始本文之前,先来介绍下如何使用vue3和electron来快速搭建项目. ...

随机推荐

  1. HarmonyOS 3百机升级计划,来了!

    HarmonyOS 3规模升级来了! 为大家奉上百余款机型升级计划! 你的手机什么时候可以升级? 赶快下滑查看!

  2. linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]

    前言 简单介绍一下不可中断进程和僵尸进程. 正文 先来看下进程的状态: 那么这一列的状态是什么呢? R 是Running 或 Runnable 的缩写, 表示进程在cpu 的就绪队列中,正在运行或者正 ...

  3. webpack 打包jquery

    前言 记一次配置webpack jqeury中的案例. 正文 选取自己需要安装的jquery版本号 dependencies:{ //此处的jquery版本根据npm后的版本来看,会有安装版本的提示 ...

  4. 利用PyTorch训练模型识别数字+英文图片验证码

    利用PyTorch训练模型识别数字+英文图片验证码 摘要:使用深度学习框架PyTorch来训练模型去识别4-6位数字+字母混合图片验证码(我们可以使用第三方库captcha生成这种图片验证码或者自己收 ...

  5. tinyproxy轻量代理服务器安装

    tinyproxy是一款用于POSIX操作系统的轻量级HTTP/HTTPS代理服务程序,非常小巧快速,便于部署,性能也不差,因此适合在嵌入式设备上使用,tinyproxy的仓库和文档链接分别是: 仓库 ...

  6. cookie与localStorage与sessionStorage

    1. cookie 1_1: 简述 HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送(由服务器设置后返回给浏览器端)到用户浏览器并保存在本地的一小块数据.浏览器 ...

  7. 力扣138(java)- 复制带随机指针的链表(中等)

    题目: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其 ...

  8. 一首歌的时间,手把手搭建基于FC的网站

    简介: 不是杰伦的那一首歌啦~ 部署网站 说好不哭 在接触serverless架构之前,我们如果想实现上线一个Web网站,就要在开发前期经过操作很多冗杂但又必须的步骤,不少小白可谓是快速的从入门到退坑 ...

  9. Dubbo-go 优雅上下线设计与实践

    ​简介:在分布式场景下,微服务进程都是以容器的形式存在,在容器调度系统例如 k8s 的支持下运行,容器组 Pod 是 K8S 的最小资源单位.随着服务的迭代和更新,当新版本上线后,需要针对线上正在运行 ...

  10. 系统架构面临的三大挑战,看 Kubernetes 监控如何解决?

    ​简介: 随着 Kubernetes 的不断实践落地,我们经常会遇到负载均衡.集群调度.水平扩展等问题.归根到底,这些问题背后都暴露出流量分布不均的问题.那么,我们该如何发现资源使用,解决流量分布不均 ...