主頁 > .NET開發 > [Asp.Net Core] Blazor Server Side 擴展用途 - 配合CEF來制作帶瀏覽器核心的客戶端軟體

[Asp.Net Core] Blazor Server Side 擴展用途 - 配合CEF來制作帶瀏覽器核心的客戶端軟體

2020-09-14 20:06:47 .NET開發

實作

目前專案已經實作了大部分目標

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的用  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(3000);
        }

 

 

不要用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執行. 

...

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/38379.html

標籤:.NET Core

上一篇:netcore資料連接配置

下一篇:.NET Core 使用MediatR CQRS模式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more