一、什麼是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-hant/n/258261.html
微信掃一掃
支付寶掃一掃