一、什麼是cefsharp.browsersubprocess
cefsharp.browsersubprocess是Chromium Embedded Framework(CEF)的一部分,是Chromium內核的一個子進程,主要用於處理CEF應用程序中的瀏覽器功能。它是cefsharp瀏覽器控制項的核心組成部分之一,控制項本身可以顯示網頁,但必須通過瀏覽器子進程才能實現交互。
CEF本身是一個開源項目,旨在為C++應用程序提供嵌入式Chromium瀏覽器功能。cefsharp是它的一個.NET封裝,使得開發人員可以在.NET中使用CEF的功能。它提供了一個名為CefSharp.WinForms.ChromiumWebBrowser的WinForms控制項,使得用戶可以在應用程序中嵌入並顯示一個Chromium瀏覽器。
二、cefsharp.browsersubprocess的作用
cefsharp.browsersubprocess的主要作用是為CEF應用程序中的瀏覽器提供支持。因為CEF瀏覽器控制項本身並不包含瀏覽器引擎,它需要與瀏覽器子進程進行通信以實現基本的瀏覽器功能。瀏覽器子進程在CEF應用程序中起著至關重要的作用。
瀏覽器子進程主要包括以下功能:
- 網路請求:瀏覽器進程通過IPC(inter-process communication,進程間通信)向子進程發送請求,子進程負責執行這些請求並返回結果。子進程還會處理Cookie、緩存、TLS證書等網路相關的任務。
- JavaScript執行:瀏覽器進程將JavaScript代碼傳遞給子進程執行,並接收代碼執行的結果。子進程的JavaScript執行環境與瀏覽器進程不同,在子進程的JavaScript執行環境中,不能使用訪問瀏覽器DOM、CSS的API,但是可以訪問CEF的API。
- 瀏覽器渲染:子進程負責渲染網頁,並將渲染後的內容傳遞給瀏覽器進程顯示。CEF使用Chromium作為底層渲染引擎,子進程中使用的就是Chromium底層的渲染引擎。
三、如何使用cefsharp.browsersubprocess
使用cefsharp.browsersubprocess,需要先安裝cefsharp NuGet程序包。
Install-Package CefSharp.WinForms
在使用CefSharp的WinForms控制項之前,需要在應用程序的入口點中先初始化CEF:
static void Main() { Cef.EnableHighDPISupport(); CefSettings settings = new CefSettings(); settings.CachePath = "cache"; Cef.Initialize(settings); // ... Cef.Shutdown(); }
定義一個CefSharp.WinForms.ChromiumWebBrowser控制項,設置它的Dock屬性:
public partial class MainForm : Form { public MainForm() { InitializeComponent(); ChromiumWebBrowser browser = new ChromiumWebBrowser("https://www.google.com"); browser.Dock = DockStyle.Fill; this.Controls.Add(browser); } }
四、如何與cefsharp.browsersubprocess進行交互
CEF應用程序中,瀏覽器進程與瀏覽器子進程使用IPC進行通信。在CEF中,IPC有兩種實現方式:Chrome IPC和Basic IPC。
Chrome IPC是基於Google Chrome瀏覽器的IPC實現,也是默認的實現方式。使用Chrome IPC需要調用以下代碼:
CefSharpSettings.LegacyJavascriptBindingEnabled = true; browser.RegisterAsyncJsObject("external", new ExternalObject(), false);
其中,ExternalObject是對瀏覽器進程與子進程之間的通信進行了封裝,它實現了一些JSBridge的功能。在應用程序中,可以使用這個類定義一個對象,然後通過註冊這個對象的方式,在瀏覽器進程和子進程之間建立通信。
例如,我們在應用程序中定義了一個名為「Interop」的對象,代碼如下:
public class Interop { public void DoSomething(string arg) { MessageBox.Show(arg); } }
然後,在註冊這個對象時,需要指定在瀏覽器JavaScript中調用這個對象時的名稱:
browser.RegisterAsyncJsObject("interop", new Interop());
在JavaScript代碼中,通過外部對象「interop」即可調用定義好的「Interop」對象中的方法:
Interop.DoSomething("Hello World!");
五、如何調試cefsharp.browsersubprocess
CEF提供了一套調試工具,可用於調試CEF應用程序中的瀏覽器進程和瀏覽器子進程。需要首先開啟CEF的Debug模式,在初始化CEF的Settings參數中設置以下參數:
settings.LogFile = "cef.log"; settings.LogSeverity = LogSeverity.Verbose; settings.RemoteDebuggingPort = 20480; settings.RemoteDebuggingPipeName = "cefsharp_debug";
其中,RemoteDebuggingPort是Debug的埠號,設置RemoteDebuggingPipeName是為了避免瀏覽器啟動多次導致調試埠被佔用的問題。
在CEF應用程序中,啟用調試器的方法是,在啟動應用程序時,指定程序的命令行參數:
static void Main(string[] args) { Cef.EnableHighDPISupport(); CefSettings settings = new CefSettings(); settings.CachePath = "cache"; settings.LogFile = "cef.log"; settings.LogSeverity = LogSeverity.Verbose; settings.RemoteDebuggingPort = 20480; settings.RemoteDebuggingPipeName = "cefsharp_debug"; Cef.Initialize(settings); if (args.Contains("--debug")) { MainForm form = new MainForm(); form.Show(); Cef.DoMessageLoopWork(); Application.Run(); } else { // ... } Cef.Shutdown(); }
然後,在瀏覽器進程中,可以打開Chrome瀏覽器,輸入以下地址:
chrome://inspect/
點擊「Open dedicated DevTools for Node」按鈕,即可打開調試器。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258261.html