核選型指南:CefSharp與WebView2在桌面應(yīng)用中的技術(shù)對比)
簡介9款基于C#的瀏覽器源碼合集面向初涉桌面瀏覽器開發(fā)或希望提升WinForm/WebView應(yīng)用能力的開發(fā)者。其中兩個為基礎(chǔ)版本其余為經(jīng)過修正的多功能多頁版本適合對照學習從頁面加載、標簽頁管理到常用工具欄與設(shè)置功能的實現(xiàn)思路。壓縮包共1108個文件以cs源碼為主體輔以resx/resources資源文件、jpg/png/gif/ico界面素材、sln/csproj工程文件以及少量exe演示程序與txt說明文檔整體大小約29.37MB。目前已有881人學習下載。借助Visual Studio C# 2010學習版即可打開工程既能直接體驗不同瀏覽器風格也能通過源碼對比基礎(chǔ)版與增強版的差異是熟悉C#桌面應(yīng)用和瀏覽器組件整合的實用參考資料。1. 九款C#瀏覽器源碼到底能拿來做什么——先說結(jié)論再拆貨手里攥著一個叫“9款C#瀏覽器源碼及效果演示”的壓縮包第一反應(yīng)是什么我猜大概率是“又是個重復(fù)造輪子的合集”但真把它當成一個目錄去翻你會發(fā)現(xiàn)這九款不是九個重復(fù)項目而是四條不同路線的全家桶有基于Chromium內(nèi)核的、有基于IE內(nèi)核的、有縫合了WebView2的、還有純粹自己畫界面的極簡演示。換句話說這個合集最大的價值不是跑通某一個Demo而是讓你一次性把C#世界里“瀏覽器”這個詞的所有實現(xiàn)方式看全然后根據(jù)業(yè)務(wù)需求選基座、做二次開發(fā)。我見過不少團隊在這上面踩過坑——先選了個看似小巧的瀏覽器控件結(jié)果PPT展示沒問題真上線跑業(yè)務(wù)系統(tǒng)時內(nèi)核版本不達標、渲染兼容性崩了死得莫名其妙。這篇筆記我用一個測試項目帶著你把這九款源碼跑起來、看效果、比對差異重點講清楚內(nèi)核選型、改造方向和坑在哪末了再給你一個能判斷某個瀏覽器源碼值不值得用的驗證方法。適合正在做WinForm/WPF桌面殼、嵌入式交互界面、貨架展示屏這類業(yè)務(wù)的開發(fā)者和技術(shù)選型負責人別被九這個數(shù)字沖昏頭先看怎么拆。2. 先看懂貨架上的四類“C#瀏覽器”內(nèi)核決定上限架構(gòu)決定改造成本2.1 為什么說內(nèi)核是瀏覽器的天花板C#的瀏覽器實現(xiàn)說穿了九成工作量不在C#本身而在你捆綁了什么東西當渲染內(nèi)核。這九款源碼分開看基本逃不出四個路線CefSharp、GeckoFXFirefox老內(nèi)核、微軟系WebView2、以及Net WebBrowser控件的純IE殼。站在工程角度內(nèi)核決定了你能展示什么樣的網(wǎng)頁、渲染新CSS到什么程度、是否支持音頻視頻流、以及長期維護的安全性。CefSharp在WinForm/WPF里最流行因為它把Chromium塞進一個控件你要的HTML5、GPU硬解、遠程調(diào)試全都帶出來了缺點是第一次加載較慢、包體大。WebView2是微軟主推的新方案底層綁定Edge的Chromium運行時系統(tǒng)有新Edge就省掉一大部分體積且生命周期受系統(tǒng)更新管控。GeckoFX這幾年用的人少了項目停滯在新Firefox版本之前只適合舊系統(tǒng)維穩(wěn)。至于WebBrowser控件那是Windows老祖宗默認跑IE7兼容模式稍微看個現(xiàn)代網(wǎng)頁就翻車但這九款里往往有一兩個偏偏用它在湊數(shù)好讓你形成對比記憶。可以這么說內(nèi)核是上限C#殼是下限。拿到源碼后不要先沖進代碼看界面設(shè)計第一件事是打開項目文件和依賴清單確認它掛的是哪套內(nèi)核、哪個版本、更新于什么時間。版本號很關(guān)鍵CefSharp的版本過老意味著Chromium內(nèi)核停留在兩三年甚至更舊的安全水平這在連內(nèi)網(wǎng)業(yè)務(wù)系統(tǒng)都開始提EOL審計的背景下不是小事。2.2 架構(gòu)形態(tài)差異應(yīng)用型、控件型、單文件演示型九款源碼里結(jié)構(gòu)形態(tài)差別很大直接關(guān)系到你拿到后能不能在現(xiàn)有項目里復(fù)用。第一種是完整應(yīng)用型自帶主窗體、菜單欄、地址欄、收藏夾和設(shè)置頁打開就能當瀏覽器用適合做企業(yè)內(nèi)網(wǎng)專用殼或者一體化終端。第二種是控件型——這才是絕大多數(shù)二次開發(fā)真正需要的形態(tài)它不給你界面只給一個控件你拖到自己窗體里注入JS、攔截請求、設(shè)置Cookie像拼積木一樣。第三種是單文件演示型通常是幾行代碼展示W(wǎng)ebBrowser或WebView2能夠加載某個網(wǎng)頁不構(gòu)成產(chǎn)品但很適合拿來跑通環(huán)境依賴。拿我自己的習慣說拿到多款源碼合集時不會每個都建工程跑而是先讀兩個文件項目清單和入口類。清單里寫了每個Demo對應(yīng)的內(nèi)核入口類寫了它是應(yīng)用型還是控件型。第二步才是挑選兩款有代表性的逐行編譯一款選CefSharp的完整應(yīng)用型另一款選WebView2的控件型。這兩個一旦跑通其余七款基本就是它們的功能縮減或界面加工看代碼結(jié)構(gòu)就能推斷效果。2.3 用表格快速建立九款源碼的定位判斷沒有正文的源碼包拿到手別急著運行先按下面這張表自行建檔。這里不寫死具體版本因為合集里的版本通常不一致按照“內(nèi)核形態(tài)”兩列歸類后選型思路就清楚了。序號內(nèi)核路線形態(tài)類型適合場景改造難度1-3CefSharp完整應(yīng)用型內(nèi)網(wǎng)業(yè)務(wù)系統(tǒng)桌面殼中4-5CefSharp控件型需要深度定制界面的交互屏低6-7WebView2控件型/單文件新項目首選依賴環(huán)境較為干凈的機器低8GeckoFX完整應(yīng)用型舊系統(tǒng)維穩(wěn)觀察項高9WebBrowser單文件演示型快速驗證、臨時演示低但上限極低這個表格是用半小時梳理九個Demo的項目引用文件就能得出的結(jié)論。如果你看到某款的引用列表里出現(xiàn)了CefSharp.WinForms和CefSharp.Core那就是CefSharp路線如果出現(xiàn)Microsoft.Web.WebView2.WinForms那就是WebView2路線如果是System.Windows.Forms.WebBrowser那就是第9款功能非常有限??窟@個辦法九款源碼看一眼就完成初步分類了不用挨個編譯浪費時間。3. 把九款源碼跑起來從建測試項目到效果演示的操作全流程3.1 建一個干凈的中立測試項目先復(fù)現(xiàn)環(huán)境拿到源碼包我建議你的第一個動作不是直接打開某款源碼去編譯而是新建一個獨立的測試項目先把依賴環(huán)境跑通再逐個把源碼里的控件或窗體代碼移植進來。這樣做的好處是源碼作者可能用了和你電腦不同的.NET版本、不同的目標平臺、不同的NuGet源先搭好公共環(huán)境可以快速定位是源碼問題還是環(huán)境問題。dotnet new winforms -n BrowserLab cd BrowserLab dotnet add package CefSharp.WinForms dotnet add package Microsoft.Web.WebView2 dotnet build這段命令創(chuàng)建了一個WinForm空項目并預(yù)裝了兩個主流瀏覽器內(nèi)核的NuGet包。BrowserLab是測試殼的名字跑完dotnet build后注意看是否有版本沖突提示最常見的錯誤就是CefSharp的WinForms包和Core包版本不一致。NuGet會自動拉取依賴但CefSharp在.csproj里需要顯式聲明平臺目標否則會出現(xiàn)“未找到CefSharp.Core”一類的問題。平臺目標的配置在.csproj里加一行這是CefSharp老生常談的坑不加等著編譯報錯就行Platformsx64/Platforms除了平臺聲明還要確保項目文件里UseWindowsForms是true這是.NET 6以上項目模板的默認值但如果你從老項目改過來可能缺失。到這一步dotnet build如果順利說明本機的.NET SDK版本和NuGet源都沒問題可以開始逐個接入源碼Demo了。3.2 核心演示步驟把CefSharp源碼接到測試殼九款源碼中CefSharp路線的占大頭以其中“控件型”的一款為例把整個接入過程復(fù)現(xiàn)出來。核心思路就三步創(chuàng)建控件實例、綁定生命周期事件、把控件添加到窗體。public partial class MainForm : Form { private ChromiumWebBrowser _browser; public MainForm() { InitializeComponent(); // 初始化瀏覽器控件address參數(shù)傳入起始頁 _browser new ChromiumWebBrowser(https://example.com) { Dock DockStyle.Fill }; // 掛載加載狀態(tài)回調(diào)用于觀察頁面加載過程 _browser.LoadingStateChanged OnLoadingStateChanged; this.Controls.Add(_browser); } private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { // 在UI線程更新標題欄直觀反饋加載進度 this.Text e.IsLoading ? 加載中... : 加載完成; } }ChromiumWebBrowser是CefSharp的核心控件構(gòu)造函數(shù)第一個參數(shù)是首頁URLDock DockStyle.Fill讓控件填滿窗體這是演示效果最直觀的布局LoadingStateChanged事件每幀都會觸發(fā)所以回調(diào)里頂多改個文本狀態(tài)不要放重邏輯。如果你照著這個接入某款源碼時發(fā)現(xiàn)頁面始終空白優(yōu)先檢查本機是否缺少CefSharp運行所需的Visual C運行庫這是它的老毛病下面避坑章節(jié)會詳細說。3.3 演示W(wǎng)ebView2路線的源碼全新初始化模式WebView2的源碼接入方式和CefSharp稍有不同最大的區(qū)別是它為null時的環(huán)境初始化。新版WebView2必須在控件創(chuàng)建時確保運行時已經(jīng)就緒否則會靜默失敗。代碼如下public partial class Wv2Form : Form { private WebView2 _webView2; public Wv2Form() { InitializeComponent(); _webView2 new WebView2 { Dock DockStyle.Fill }; this.Controls.Add(_webView2); // EnsureCoreWebView2Async是關(guān)鍵步驟異步初始化原生內(nèi)核 _ InitializeAsync(); } private async Task InitializeAsync() { var userDataFolder Path.Combine( AppDomain.CurrentDomain.BaseDirectory, Wv2Cache); // 指定獨立用戶數(shù)據(jù)目錄避免影響其它程序 var env await CoreWebView2Environment.CreateAsync(null, userDataFolder); await _webView2.EnsureCoreWebView2Async(env); _webView2.Source new Uri(https://example.com); } }EnsureCoreWebView2Async是WebView2控件生命周期的開始它的內(nèi)部會檢查系統(tǒng)中是否存在WebView2 Runtime。如果沒有Runtime這一行調(diào)用會拋異常所以應(yīng)該用try/catch包住并引導(dǎo)用戶安裝運行時。CoreWebView2Environment.CreateAsync里第二個參數(shù)是用戶數(shù)據(jù)文件夾這種獨立緩存的寫法是推薦的避免和系統(tǒng)級Edge互相干擾。演示起來WebView2首屏加載的速度通常比CefSharp快一些這是因為系統(tǒng)Edge已經(jīng)把內(nèi)核常駐了一部分。3.4 參數(shù)級別的配置真實項目中必調(diào)的三個選項源碼是演示級跑通只是第一步真拿到項目里用以下三個參數(shù)必須根據(jù)場景調(diào)整。第一是CefSharp的緩存路徑與日志級別默認日志在cef.log緩存目錄默認在C盤用戶目錄下在CI工控機上跑久了會自動膨脹。建議在應(yīng)用啟動前重新指定var settings new CefSettings { CachePath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cef_cache), LogFile Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cef_log.txt), LogSeverity LogSeverity.Warning }; Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);第二個參數(shù)是WebView2的瀏覽器擴展權(quán)限。默認情況下擴展是禁用的如果你的業(yè)務(wù)需要支持瀏覽器擴展要顯式放開如果不需要不要開每開一項都是攻擊面_webView2.CoreWebView2.Settings.AreBrowserExtensionsEnabled false; _webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled false; _webView2.CoreWebView2.Settings.IsStatusBarEnabled false;第三是內(nèi)核的GPU開關(guān)。在遠程桌面或虛擬化環(huán)境里GPU加速反而是白屏元兇判斷標準是本地物理機顯示正常一到遠程就掉幀或花屏那就強制關(guān)掉// CefSharp中關(guān)閉GPU加速僅軟件渲染 settings.CefCommandLineArgs.Add(disable-gpu); settings.CefCommandLineArgs.Add(disable-gpu-compositing);這三組參數(shù)調(diào)完效果演示才具備參考意義默認狀態(tài)的演示是“能打開”調(diào)完參的演示才是“能上線”。這也是為什么我上面反復(fù)強調(diào)先建測試殼再逐個接源碼的原因——你總不能每測一款都去翻它自帶的配置文件在統(tǒng)一環(huán)境里驗證才是可靠做法。3.5 效果演示的經(jīng)典組合模板九款源碼全部編譯通過后想做一個完整的可視化對比臺再加一個下拉框就行了。窗體左邊放一個下拉框列出九款Demo名稱右邊放一個容器選中哪項就把對應(yīng)的瀏覽器控件加載到容器里。這個演示臺的代碼邏輯不復(fù)雜但能直觀看出各內(nèi)核加載同一個URL的差異。private void comboBox_SelectedIndexChanged(object sender, EventArgs e) { panelContent.Controls.Clear(); switch (comboBox.SelectedIndex) { case 0: // CefSharp控件型 var cef new ChromiumWebBrowser(https://example.com); panelContent.Controls.Add(cef); break; case 1: // WebView2控件型 var wv2 new WebView2 { Dock DockStyle.Fill }; panelContent.Controls.Add(wv2); _ InitWv2Async(wv2); break; case 2: // WebBrowser控件型 var wb new WebBrowser { Dock DockStyle.Fill }; wb.Navigate(https://example.com); panelContent.Controls.Add(wb); break; } }這個模板的用意在于九款源碼的界面差異本質(zhì)是內(nèi)核差異其他花哨功能都是演示皮。把內(nèi)核都加載到同一容器加載同一個URL誰渲染快、誰的布局穩(wěn)定、誰在縮放時卡頓一眼就能分出高下。實際業(yè)務(wù)選型時這個對比臺可以直接作為驗收工具拉著相關(guān)開發(fā)和測試對著同一批測試網(wǎng)頁過一遍比任何人拍腦袋都有說服力。4. 從源碼到基座選CefSharp還是WebView2的實體筆記先聲明一個觀點九款源碼里我一般只認真研究CefSharp和WebView2兩類。剩下的GeckoFX和WebBrowser定位上就決定了它們只是歷史參照物——除非你被老系統(tǒng)的縱橫依賴綁死否則沒必要在它們身上花時間。這一章把兩款主流內(nèi)核放在桌面應(yīng)用的真實語境里做深度對比涵蓋內(nèi)存占用、安裝體積、部署復(fù)雜度、調(diào)試手段這些各有偏好但常被忽略的細節(jié)點。CefSharp的優(yōu)勢在于它的特征和“傳統(tǒng)桌面端”綁定得非常深控件行為穩(wěn)定API設(shè)計有年頭但覆蓋面廣WebBrowser控件做不到的攔截、注入、自定義協(xié)議頭它全都提供。例如給頁面注入一段腳本獲取某個DIV的文本、攔截指定URL并修改返回內(nèi)容這些都是CefSharp的看家本領(lǐng)。它的劣勢也很清晰——每個部署機器都要帶一套CEF依賴打包后的體積輕松多出100MB以上啟動會先有幾百毫秒的“黑匣子期”。WebView2則把大量臟話活交給了系統(tǒng)Edge運行時。它自身尺寸可以控制在幾MB量級安裝環(huán)節(jié)有官方引導(dǎo)程序可以集成到部署流程里。調(diào)試方面它比CefSharp更“現(xiàn)代”直接用DevTools協(xié)議和Edge的遠程調(diào)試端口就能看網(wǎng)絡(luò)請求和DOM。它的缺點是脫離系統(tǒng)環(huán)境就玩不轉(zhuǎn)離線環(huán)境必須提前裝Runtime安裝包且它的渲染優(yōu)先級受Edge本身生命周期影響。你寫一篇題為“9款C#瀏覽器源碼及效果演示”的文章來做選型參考我看到最終吃香的還是這兩款里的一個。業(yè)務(wù)決策落到地面推薦參考以下判斷框架目標機器連內(nèi)網(wǎng)、系統(tǒng)環(huán)境雜、不允許聯(lián)網(wǎng)裝運行時直接選CefSharp路線把CEF依賴一并打好。目標機器是普通辦公環(huán)境、允許安裝Edge運行時選WebView2路線更新維護都省心。你的技術(shù)棧本身是WinForm老項目想盡量少引入大體積依賴選WebView2如果項目里已經(jīng)有一堆CefSharp歷史包袱穩(wěn)健為先繼續(xù)用它。你的頁面里有大量現(xiàn)代CSS動畫、WebGL、實時視頻流兩者都行但注意CefSharp要在部署機上開啟GPUWebView2默認就是硬加速同樣需要確認驅(qū)動。5. 避坑指南編譯、內(nèi)核加載與效果演示的三個高頻問題5.1 現(xiàn)象CefSharp控件在窗體上白屏沒有任何報錯這個現(xiàn)象堪稱CefSharp路線的“新手見面禮”。窗體正常跑起來控件也在但一個像素都沒有渲染打開任務(wù)管理器又能看到加載進程說明CefSharp初始化已經(jīng)走到了內(nèi)核啟動階段只是在最后視覺呈現(xiàn)環(huán)節(jié)出了問題。原因通常有兩種第一目標平臺是x86/x64和CefSharp依賴不匹配常見于把項目編譯成了AnyCPU而CEF只支持明確的架構(gòu)第二編譯出來的目錄缺了cef.pak、chrome_elf.dll這些關(guān)鍵依賴文件在64位環(huán)境里尤其容易因為清理臨時文件被誤刪。解決方法是先檢查輸出目錄的文件完整性確認存在libcef.dll、cef.pak、icudtl.dat等文件然后把平臺強制設(shè)為x64或按項目既定架構(gòu)統(tǒng)一再清干凈bin和obj目錄重新編譯。如果還白屏就打開cef_log.txt看最后幾行關(guān)鍵字GPU、crash能直接定位崩潰段。5.2 現(xiàn)象WebView2首次運行拋出“未找到運行時”的異常演示場景里拿到一款WebView2源碼放到公司沒裝過Edge的測試機上一運行就異常退出極少有人會想到是運行時缺失因為很多開發(fā)機都自帶Edge。原因是WebView2控件的本機依賴WebView2 Runtime而它并不總是跟隨Windows系統(tǒng)更新預(yù)裝。解決思路兩條臨時解決下載官方運行時安裝包裝一遍工程化解決將運行時引導(dǎo)安裝程序嵌入部署腳本。后者作為正式項目更推薦用靜默安裝參數(shù)在程序啟動時檢查注冊表缺失就拉起安裝。5.3 現(xiàn)象演示某款源碼時頁面錯亂跟本機瀏覽器打開完全不一樣這個現(xiàn)象很迷惑但也最容易讓人誤判成源碼問題??烧嫦嗟炔涣恕隳玫氖荳ebBrowser控件去演示現(xiàn)代網(wǎng)頁它默認用IE7兼容模式渲染而現(xiàn)代網(wǎng)站早就放棄IE技術(shù)規(guī)格了當然亂套。解決方法很簡單先用F12看這個WebBrowser控件加載時用的是哪個文檔模式如果是ie7就必須在操作系統(tǒng)注冊表中為當前應(yīng)用程序配置FEATURE_BROWSER_EMULATION項把值改成11001或11000讓控件模擬現(xiàn)代Edge或IE11模式。C#源碼里的處理一般是寫在Program.cs或Main入口做注冊表寫入再啟動界面?zhèn)€別源碼沒寫你就要自己補。5.4 現(xiàn)象CefSharp調(diào)試器附加時整個進程退出或者觸摸屏上無法滾動這兩個現(xiàn)象來自同一根因——CEF的多進程模型和調(diào)試/觸控環(huán)境適配。CEF是主進程拆出多個渲染子進程你用斷點掛在主進程子進程不受控就會在附加時崩潰或退出觸控屏上頁面無法滾動則是默認啟用了觸摸模擬但沒適配驅(qū)動輪詢。解決調(diào)試問題的做法是把CEF子進程配置同步到調(diào)試器或者干脆開性能分析模式跑完整進程解決觸控滾動則是在初始化參數(shù)里顯式給命令開關(guān)禁用平滑滾動、改成兼容坐標系輸入。這類問題有一個共性——它不屬于常規(guī)功能缺陷要靠運行環(huán)境的現(xiàn)場調(diào)試才能定位源碼包自帶的演示程序越簡單越不會暴露這種深層環(huán)境差異。5.5 現(xiàn)象同一套源碼開發(fā)機效果正??蛻魴C器上字體發(fā)虛、布局偏移這是內(nèi)核渲染設(shè)置在不同DPI縮放比下的經(jīng)典癥狀。開發(fā)機一般是100%或125%縮放客戶機器可能是150%、175%CEF和WebView2默認關(guān)閉了“按系統(tǒng)DPI感知渲染”導(dǎo)致頁面布局邏輯像素和實際縮放不一致。解決辦法是在項目入口強制設(shè)置進程DPI感知而不是依賴控件的默認行為[DllImport(user32.dll)] static extern bool SetProcessDPIAware(); // 在Main入口最早調(diào)用 SetProcessDPIAware();如果用了CefSharp還需要在settings里跟上一條命令參數(shù)settings.CefCommandLineArgs.Add(force-device-scale-factor, 1);這些坑本質(zhì)是“開發(fā)環(huán)境與部署環(huán)境不一致”的工程問題跟源碼沒什么關(guān)系。凡是看到“換個機器就正?!眱?yōu)先排查系統(tǒng)層面的運行時、DPI、GPU三項別忙著改代碼。6. 從演示到上線用一套驗證流程給源碼做體檢拿到源碼不直接上生產(chǎn)先在測試環(huán)境做一次“三分鐘體檢”這套流程我用過很多次血淚經(jīng)驗攢出來的推薦你照抄。第一步是清單體檢用命令行或腳本把源碼引用的NuGet包全部列出來看看有沒有引入已停止維護的組件以及各包的版本發(fā)布時間。某開發(fā)者A同學當時拿到一個很順手的瀏覽器源碼沒做這一步直接集成進產(chǎn)品結(jié)果上線一周后客戶機器上出了兼容故障排查半天才發(fā)現(xiàn)里面嵌了個三年前的運行時后來換新版本重編才徹底解決。版本體檢這一步的價值是把“看上去好用”和“真正能用”劃清界限。第二步是接口體檢把源碼里對外暴露的“公共類和方法”列個清單。如果是控件型關(guān)注它有沒有提供LoadUrl、ExecuteScriptAsync、RequestHandler如果是應(yīng)用型關(guān)注它是否有配置化入口沒有的話后面做二次開發(fā)的工作量會大不少。這一步要做細直接決定你后續(xù)改造的體力成本。第三步是運行時體檢——這也是效果演示的終極版本把你業(yè)務(wù)里最復(fù)雜的那個頁面放進去打開任務(wù)管理器觀察內(nèi)存曲線、CPU峰值和渲染幀率對照選型框架過一遍。具體做法是固定加載頁面停留3分鐘記錄內(nèi)存反復(fù)執(zhí)行縮放、跳轉(zhuǎn)、刷新操作100次記錄崩潰次數(shù)再用DevTools協(xié)議抓一批網(wǎng)絡(luò)請求確認是否有跨域攔截、證書報錯等問題。第四步回到項目代碼本身把demo里的初始化代碼移到自己的業(yè)務(wù)殼里測試一遍有一說一這一步一定要做因為它會暴露很多“演示環(huán)境下不存在”的問題比如業(yè)務(wù)頁面對CefSharp的關(guān)鍵字攔截依賴而整合進自有代碼后攔截沒生效再比如WebView2的初始化和業(yè)務(wù)登錄態(tài)的時序沖突。等這一輪驗證全通過了再把這個源碼當作真正的基座投入開發(fā)里去。一句話收尾瀏覽器技術(shù)選型這件事與其在理論上爭高下不如先把九款源碼都跑起來親眼看一遍加載和渲染的實際差異再結(jié)合自己的業(yè)務(wù)目標做取舍。技術(shù)沒有面面俱到的版本只有適不適合你那一攤事的標準做技術(shù)的習慣別只看上不上眼得看扛不扛得住用。希望幫到你。本文還有配套的精品資源點擊獲取