[Asp.Net Core] Blazor Server Side 扩展用途 - 配合CEF来制作客户端浏览器软件
实现
目前项目已经实现了大部分目标
https://www.cnblogs.com/zhgangxuan/p/asp_net_core_blazor_server_side_cef_winforms_2.html
https://github.com/BlazorPlus/BlazorCefApp
补充
谢谢小编的推荐.
在这补充一下.
- 项目现在还未完成. 文中的做法已经包含所有新增的代码, 开源项目还没开始上传, 要晚点到一个可用的阶段.
- 目前处于一个测试阶段, 先测试各种可能性, 看看这个想法最远能达到哪里.
- 当前测试进度是, CEF , Asp.Net Core , Console , Wpf , WinForms , ActiveX(WinForms) 这些东西都可以在单个进程里同时运行.
开发侧重点:
- 照顾各种入门级开发人员, 让他们可以专注于实现程序, 而不是学习浏览器框架如何使用. 做到开箱即用.
- 一如既往, 侧重于Windows, 所以直接支持 Wpf/WinForms/ActiveX , 不做跨平台. (跨平台请到github找Chromely)
- 不搞框架, 而是搞成类库与模板. 能用一句 静态方法/全局函数 解决的事情, 绝对不会搞成多个class协作的模式.
时间安排上:
- 不会太快, 不会全力放到这事情上. 要做的其他事情还很多.
- 还好, 因为这项目的主要目标还是运行Blazor server side, Blazor还在发展中, 这个方案完成后, Blazor也越来越多人用了. 飞一会儿.
模板程序:
- 最简模板, 仅CEF+Asp.Net Core的部分(MVC/Blazor), 让开发者可以有一个干净的起点.
- WPF+WinForms模板, 开发者按需要显示WPF的Window或WinForms的Form, 或混合使用.
用Blazor server side做客户端程序的例子 , 尽量做到看上去和其他Windows程序没什么两样 :
- Demo - 记事本 , 做一个很简单的多Tab的 代码/文本 编辑工具.
- Demo - 注册表编辑器 , 纯粹是Demo, 用于强调这是客户端程序
- Demo - 画图程序 , 打开保存本地的图片, 跨域名加载各种网络图片做素材.
- Demo - 远程桌面管理, 仿照 tsmmc.msc 做一个出来. tsmmc.msc 有一些缺点, 想做一个自己用的界面模式.
- Demo - 嵌入Word/Excel编辑(需客户端安装Office) , 这可能是很多人想要的. 业务系统需要打开一个对话框, 编辑完回传给服务器.
- Demo - 与服务器进行通信的例子, 包含登录验证, 大文件断点续传, 动态下载dll并在客户端执行.
还有一个很大型的视频剪辑制作工具的想法, 这个是后话了. 想法太多, 往往最后是不做的.
(更后的后话, 跨平台的版本以后肯定会做的. 但是这要观察Xamarin做到什么程度. 也许Xamarin就会直接搞出blazor server side的跨平台版本, 在Windows上模拟各种环境开发, 然后部署到各种平台上)
前言
大家用过微信PC端吧? 这是用浏览器做的.
用过Visual Studio Code吧? 也是用浏览器做的.
听说, 暴雪客户端也包含浏览器核心??
在客户端启动一个浏览器, 并不是什么难事了.
现在既然用开了Blazor server side技术 ,
那么当然是也想用Blazor server side来做客户端软件了.
没错, 的确是Blazor server side技术. 客户端也可以使用这技术的.
虽然现在有很多各种各样用于 DotNet 的 CEF 框架, 但是大部分还没有一步到位.
这次要做的是, 打算弄一个开源项目, 做成 DotNet 的 dll , 生成项目模板, 让开发者直接用上.
(本教程包含 C++部分, 但后续的开源项目, 会去掉C++部分, 只剩下一个CppInterop.dll 和项目模板)
开发者难度:
当这个模板做好之后, 对于初步用途来说, 没有难度. 开发者可以直接复制模板, 然后在模板上加入自己的代码便可.
和一般的CEF C#框架不一样, 这边不是针对浏览器技术, 而是针对开发者最常用的几个功能去考虑, 直接做好简单易用的API
目标与好处
- 开发者下载到项目模板之后, 用VS2019打开, 直接编译直接运行. 不要再搞那些复杂的玩意了.
- 在用户的电脑上运行 Asp.Net Core 网站, 并且自启浏览器去显示.
- 又或者, 向客户提供一个特殊的浏览器, 满足网站的扩展权限功能.
- 开发者可以像做网站一样做客户端程序.
- 不限定 Blazor , 可以是 Mvc, 甚至是ReactJS/ArgularJS/VueJS/jQuery等都OK的.
- 能保证浏览器的版本, 不用考虑浏览器兼容性问题
- Asp.Net Core在客户端运行, 拥有客户端PC的权限, 可以随意操作用户电脑的文档,
- 方便地与客户端的各种程序进行操作, 例如按需启动客户端程序编辑内容, 编辑完再继续处理.
- 键盘给大家, 大家自己写...
概念思考
- 由于是客户端程序, 所以所有的资源已经打包好了. 除非要访问服务器进行交互下载, 否则正常的功能是无延迟无网络中断问题的.
- 理论上整合了C++的部分, 是可以整合各种C++玩意, 例如把ActiveX整合进程序的.(非整合进浏览器)
- .....
以下整合步骤只给有C++经验的人士观看. 其他人等这个项目的成品出来便可.
整合步骤
CEF项目地址 : https://github.com/chromiumembedded/cef
CEF下载地址 http://opensource.spotify.com/cefbuilds/index.html , 找到 Windows 32位的版本, 这样可以兼容性更好

下载后, 解压到更短的路径, 因为后面要使用 .

进入 https://cmake.org/ , 下载 : CMake , 然后运行, 输入目录, 与输出目录(生成 VS2019 Solution).

配置:


提示有错吗? 不管. 直接点多一次 Generate 便可.

注意, VISUAL STUDIO 2019 必须安装 C++ 和 C++ CLI
打开工程, 配置编译. 我们只需编译这些玩意: (或者把那几个不用的工程删掉算了)

先编译一次, 应该会通过.

在下载的文件里面, 找到这4个文件 , C++不好写, 但是我们可以在样板工程上直接改.

复制到 libcef_dll_wrapper 工程目录下, 并且添加现有项 :

修改 simple_app.cc , 在16行插入
std::string _surl;
std::string GetStartupUrl()
{
return _surl;
} void SetStartupUrl(LPTSTR url)
{
char chars[];
int cch = WideCharToMultiByte(, , url, -, , , NULL, NULL);
WideCharToMultiByte(, , url, -, chars, cch, NULL, NULL);
_surl = chars;
} int RunCefApp(LPTSTR cmdline)
{
HINSTANCE hinst = (HINSTANCE)GetModuleHandle(NULL);
wWinMain(hinst, NULL, cmdline, );
return ;
}
找到 command_line->GetSwitchValue("url") 这一行, 把启动Url 换掉 , 这样后面 SetUrl 就有效果啦.

编译, 通过.
CppInterop工程
新增一个C++ CLI工程 (注意, CLI没打错字, CLI和CLR概念不一样, 请自行搜索)

项目名称 CppInterop 好了.
添加引用

添加 libcef.lib , Debug的用 cef32\Debug\libcef.lib , Release的用 cef32\Release\libcef.lib

修改 CppInterop.cpp
#include "pch.h" #include <Windows.h> using namespace System; void SetStartupUrl(LPTSTR url);
int RunCefApp(LPTSTR cmdline); WCHAR cscmd[4096];
WCHAR csurl[4096]; namespace CppInterop {
public ref class Cpp
{
public:
static void SetUrl(String^ url)
{
for (int i = 0; i < url->Length; i++)
csurl[i] = url[i];
csurl[url->Length] = '\0'; SetStartupUrl(csurl);
}
static int Run(String^ cmdline)
{
for (int i = 0; i < cmdline->Length; i++)
cscmd[i] = cmdline[i];
cscmd[cmdline->Length] = '\0'; return RunCefApp(cscmd); }
};
}
编译 CppInterop工程. 通过.
自此, C++部分已经完结.
BlazorApp1
新建dotnetcore Blazor Server 工程 , 添加对 CppInterop 的引用,
无论是 Debug或Release , 都修改为 x86架构

程序入口改为:
[STAThread]
public static void Main(string[] args)
{
string cmdargs = string.Join(" ", args); if (cmdargs.Contains("--type="))
{
CppInterop.Cpp.Run(cmdargs);
return;
} System.Threading.CancellationTokenSource cts = new System.Threading.CancellationTokenSource();
var tsk = CreateHostBuilder(args).Build().RunAsync(cts.Token);
CppInterop.Cpp.SetUrl("https://localhost:5001");
CppInterop.Cpp.Run(cmdargs);
cts.Cancel();
tsk.Wait();
}
不要用IIS启动了, 必须用exe方式启动:

把 D:\Temp\cef32\Resources 和 D:\Temp\cef32\Debug 复制到输出文件夹

启动项目:

Edge浏览器正常, 但是自己启动的浏览器无法启动子进程渲染器, 原因是 COM thread model 有问题. 估计是Debug模式的问题.
解决方法有两种, 一种是使用参数 --single-process 启动 :


这种模式好啊. 只有1个进程.
另外一种模式是 , 编译为Release 再执行 :

去掉 --single-process的效果:

这个和一般的浏览器的行为一致了.
显示控制台, 有助于查看调试信息.
如果不想控制台弹出来, 可以把工程的属性改掉. 从 '控制台应用程序' 改成 'Windows应用程序'
结尾
目前先记录到这里.
后面还有一大堆要和浏览器进行交互的事情.
对于开发者来说, 目前考虑有以下需求需要解决:
1 - C# 代码能控制窗口的大小 , 最大化, 最小化等等. 例如启动时固定大小, 登录后, 自动最大化.
2 - C# 代码可以自己实现一些下载的功能,
3 - 可以自定义方式弹出DevTools,
4 - 如何另外弹出WinForms, WPF界面.
5 - 如何与真正的服务器进行通信, 如何下载服务器的dll执行.
...
[Asp.Net Core] Blazor Server Side 扩展用途 - 配合CEF来制作客户端浏览器软件的更多相关文章
- [Asp.Net Core] Blazor Server Side 扩展用途 - 配合CEF来制作带浏览器核心的客户端软件 (二) 可运行版本
前言 大概3个星期之前立项, 要做一个 CEF+Blazor+WinForms 三合一到同一个进程的客户端模板. 这个东西在五一的时候做出了原型, 然后慢慢修正, 在5天之前就上传到github了. ...
- [Asp.Net Core] Blazor Server Side 项目实践 - 切换页面时保留状态
前言: 这是 项目实践系列 , 算是中高级系列博文, 用于为项目开发过程中不好解决的问题提出解决方案的. 不属于入门级系列. 解释起来也比较跳跃, 只讲重点. 因为有网友的项目需求, 所以提前把这些解 ...
- ASP.NET Core Blazor 初探之 Blazor Server
上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly).这次来看看Blazor Server该怎么玩. ...
- ASP.NET Core Blazor Webassembly 之 路由
web最精妙的设计就是通过url把多个页面串联起来,并且可以互相跳转.我们开发系统的时候总是需要使用路由来实现页面间的跳转.传统的web开发主要是使用a标签或者是服务端redirect来跳转.那今天来 ...
- 022年9月12日 学习ASP.NET Core Blazor编程系列三——实体
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- ASP.NET Core Blazor Webassembly 之 组件
关于组件 现在前端几大轮子全面组件化.组件让我们可以对常用的功能进行封装,以便复用.组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件.它封装ht ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
- 学习ASP.NET Core Blazor编程系列四——迁移
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列六——初始化数据
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
随机推荐
- iOS 优化实例
一.接口请求优化 在工程项目中,多个一级界面包含状态,如:服务入口的动态配置,未读消息数量,图片文字等,因此产品设计要每次切换 tab 时都请求数据,及时的更新页面状态.在实际开发中,频繁的调用接口, ...
- Java多线程问题40个
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- spring boot 源码赏析之事件监听
使用spring Boot已经快1年多了,期间一直想点开springboot源码查看,但由于种种原因一直未能如愿(主要是人类的惰性...),今天就拿springboot 的监听事件祭刀. spring ...
- 基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形
STM32F030F4P9定时器功能比较丰富,在此记录项目中使用其自动输出PWM波形(频率:50HZ).CubeMX配置定时器如下图说明. 在此定时器基础时钟为48MHZ,配置中不做分频处理,预分频系 ...
- HTML 基础(六)
一.脚本 JavaScript 是 HTML 页面具有更强的动态和交互性 <script> 标签 <script> 标签用于定义客户端脚本,<script> 元素既 ...
- C++STL(一)——string类
STL--string类 初始化 string的赋值 string的连接 string的性质描述 遍历 字符指针和string的转化 查找.替换.交换 字符串的拼接 区间删除. 插入 大小写转换 比较 ...
- 微信网页授权,获取微信code,获取access_tocken,获取用户信息
微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 ...
- 整数回文数判断 Python
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 输入:123 输出:false 输入:-121 输出:false 输入:121 输出:true 输入:1 ...
- Mysql主从搭建(1)
Master上授权从库: ```grant replication slave on *.* to slave1@ip identified by 'password';``` 逻辑备份: ```my ...
- 中阶d03.3 JDBC_CURD_Util --- 使用 junit执行单元测试(增删改查)
1.单元测试环境准备 https://www.cnblogs.com/longesang/p/11399010.html 2.测试 3.结果返回 4.代码 新建一个test目录统一存放测试案例 查: ...