深入解析cefsharp.browsersubprocess

一、什麼是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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:49
下一篇 2024-12-15 12:49

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論