深入解析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/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

发表回复

登录后才能评论