zoukankan      html  css  js  c++  java
  • [Asp.Net Core] Blazor Server Side 扩展用途

    实现

    目前项目已经实现了大部分目标

    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 

    目标与好处

    1. 开发者下载到项目模板之后, 用VS2019打开, 直接编译直接运行. 不要再搞那些复杂的玩意了. 
    2. 在用户的电脑上运行 Asp.Net Core 网站, 并且自启浏览器去显示. 
    3. 又或者, 向客户提供一个特殊的浏览器, 满足网站的扩展权限功能. 
    4. 开发者可以像做网站一样做客户端程序. 
    5. 不限定 Blazor , 可以是 Mvc, 甚至是ReactJS/ArgularJS/VueJS/jQuery等都OK的. 
    6. 能保证浏览器的版本, 不用考虑浏览器兼容性问题
    7. Asp.Net Core在客户端运行, 拥有客户端PC的权限, 可以随意操作用户电脑的文档, 
    8. 方便地与客户端的各种程序进行操作, 例如按需启动客户端程序编辑内容, 编辑完再继续处理.
    9. 键盘给大家, 大家自己写...

    概念思考

    1. 由于是客户端程序, 所以所有的资源已经打包好了. 除非要访问服务器进行交互下载, 否则正常的功能是无延迟无网络中断问题的. 
    2. 理论上整合了C++的部分, 是可以整合各种C++玩意, 例如把ActiveX整合进程序的.(非整合进浏览器)
    3. .....

    以下整合步骤只给有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[2048];
        int cch = WideCharToMultiByte(936, 0, url, -1, 0, 0, NULL, NULL);
        WideCharToMultiByte(936, 0, url, -1, chars, cch, NULL, NULL);
        _surl = chars;
    }
    
    int RunCefApp(LPTSTR cmdline)
    {
        HINSTANCE hinst = (HINSTANCE)GetModuleHandle(NULL);
        wWinMain(hinst, NULL, cmdline, 0);
        return 0;
    }

    找到 command_line->GetSwitchValue("url") 这一行, 把启动Url 换掉 , 这样后面 SetUrl 就有效果啦.

    编译, 通过. 

     CppInterop工程

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

     

     项目名称 CppInterop 好了. 

     添加引用

    添加 libcef.lib ,  Debug的用  cef32Debuglibcef.lib ,  Release的用  cef32Releaselibcef.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] = '';
    
                SetStartupUrl(csurl);
            }
            static int Run(String^ cmdline)
            {
                for (int i = 0; i < cmdline->Length; i++)
                    cscmd[i] = cmdline[i];
                cscmd[cmdline->Length] = '';
    
                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(3000);
            }

    不要用IIS启动了, 必须用exe方式启动:

     把 D:Tempcef32Resources 和 D:Tempcef32Debug  复制到输出文件夹 

     启动项目: 

    Edge浏览器正常,  但是自己启动的浏览器无法启动子进程渲染器,  原因是 COM thread model 有问题. 估计是Debug模式的问题. 

    解决方法有两种,   一种是使用参数 --single-process 启动 :

     这种模式好啊.  只有1个进程. 

    另外一种模式是 , 编译为Release 再执行 : 

     

     去掉 --single-process的效果:

     这个和一般的浏览器的行为一致了. 

    显示控制台, 有助于查看调试信息. 

    如果不想控制台弹出来, 可以把工程的属性改掉. 从 '控制台应用程序' 改成 'Windows应用程序'


    结尾

    目前先记录到这里. 

    后面还有一大堆要和浏览器进行交互的事情. 

    对于开发者来说, 目前考虑有以下需求需要解决:

    1 - C# 代码能控制窗口的大小 , 最大化, 最小化等等.  例如启动时固定大小, 登录后, 自动最大化. 

    2 - C# 代码可以自己实现一些下载的功能,  

    3 - 可以自定义方式弹出DevTools,

    4 - 如何另外弹出WinForms, WPF界面. 

    5 - 如何与真正的服务器进行通信, 如何下载服务器的dll执行. 

    ...

  • 相关阅读:
    SharePoint部署webpart时候,报错:部署步骤“回收 IIS 应用程序池”中出现错误: 无效命名空间 解决方案
    免费的分布式的自动化测试工具
    https://github.com/dotnetcore
    SharePoint2013与SharePoint2016语言切换原理以及如何使用代码进行语言切换
    微软开源最强Python自动化神器Playwright!不用写一行代码!
    B站播单按时间统计进度
    AF_INET与PF_INET的区别
    git显示:fatal: index file smaller than expected
    Unix系统中信号SIGKILL和SIGSTOP
    GTM、UTC和C/C++中的时间处理
  • 原文地址:https://www.cnblogs.com/zhgangxuan/p/blazor_server_side_cef_browser_01.html
Copyright © 2011-2022 走看看