在 .NET Framework 中集成 CefSharp

快速开始.

进程 Process 

线程 Threads 

Initialize 和 Shutdown.

Initialize.

Shutdown.

配置

CefSettings 

BrowserSettings 

IBrowser,IFrame 和 IBrowserHost 对象.

Handlers 

配置代理.

请求上下文.. 

高 DPI 显示器支持..

Javascript 集成..

从 .NET 中调用 Javascript 方法.. 

从 .NET 中调用带有返回结果的 Javascript 方法.. 

将一个 .NET 类型暴露给 Javascript 

 

快速开始

创建一个新的 WPF 项目,目标框架为 .NET Framework 4.5.2,本项目将使用 CefSharp 3 库,该库仅支持 x86 和 x64 应用程序,这意味着项目必须指定编译目标,不支持 Any Cpu。创建项目后,首先打开配置管理器,Solution -> Configuration Manager:
在 .NET Framework 中集成 CefSharp_第1张图片
由默认 
Debug 配置创建新的 x86 和 x64 的编译配置:
在 .NET Framework 中集成 CefSharp_第2张图片
完成配置创建后,引入 
CefSharp.Wpf Nuget 包:
uploading.4e448015.gif转存失败重新上传取消
现在,
保存所有更改并关闭 Visual Studio,因为 CefSharp 需要完全重启以加载其依赖项。重启打开 Visual Studio 项目,编译。

进程 Process

CEF 运行时包含多个进程

  • browser 进程: 主进程,负责创建窗口,渲染和网络访问,该进程大部分情况下等同于「宿主应用程序」所在的进程,且执行大部分逻辑。
  • render 进程: 渲染和与 Javascript 交互(如 JS 对象绑定)由另一个 render 进程处理,进程模型将会为每一个单独的 Origin([scheme] + [domain]) 开辟一个 render 进程。
  • plugin 进程: 负责处理诸如 Flash 等插件
  • gpu 进程: 处理渲染加速等

线程 Threads

不同级别的进程可管理多个线程,browser 进程包含了以下线程:

  • UI 线程: browser 进程的主线程,默认情况下 CefSharp 使用 setting.MultiThreadedMessageLoop = true 设置,这使得 CEF 的 UI 线程与宿主应用程序的 UI 线程使用不同的线程。
  • IO 线程: 在 browser 进程中负责处理 IPC 和网络消息
  • File 线程: 在 browser 进程中负责与「文件系统」交互
  • Renderer 线程: render 进程的主线程

Initialize 和 Shutdown

Initialize

Initialize 方法仅允许每个应用程序调用一次,该方法用于初始化底层 CEF 库,可以显式或隐式的调用该方法:

  • 隐式调用: 首次创建 ChromiumWebBrowser 实例时,将检查 CEF 是否已被初始化,如果没有,则使用默认配置调用初始化方法
  • 显式调用: 当希望指定自定义配置时,可显式调用 CEF.Initialize(CefSettings settings) 方法

Shutdown

ChromiumWebBrowser 的 WPF 和 Winform 的实现都在对应的 Exit 事件中默认调用了 Shutdown 方法。要禁用这一行为,可在任一 ChromiumWebBrowser 实例创建之前设置 CefSharpSettings.ShutdownOnExit = false

Initialize 和 Shutdown 都必须在应用程序的主线程中调用,如果在另外的线程中调用它们,应用程序将会挂起。

在 CefSharp.OffScreen 应用中,在应用程序退出前必须显式调用 Cef.Shutdown() 方法。


配置

CefSettings

CefSettings 覆盖了应用程序级别的配置,一些常见的配置包括:

  • BrowserSubprocessPath: 启用子进程的路径,通常不建议更改
  • MultiThreadedMessageLoop: 默认为 true,也可以设置为 false 并将 Cef 集成至现有应用程序的消息泵中,参考 https://github.com/cefsharp/CefSharp/issues/1748
  • CommandLineArgsDisabled: 设置为 true 以禁用使用标准的 Chromium 命令行参数控制浏览器行为
  • CachePath: 缓存数据在本机上存放的路径,若为空,则使用临时缓存和内存缓存。仅当该设置不为空时,HTML5 数据库(如 localStorage)才会被持久化
  • Locale: 传给 Blink 的本地化信息,en-US 为默认值,可由命令行参数 lang 控制
  • LogFile: Debug 日志使用的持久化目录与文件名。./debug.log 为默认值。可由命令行参数 log-file 控制
  • LogSeverity: 类似于 LogLevel,仅当等于或高于该级别的日志将会记录,可由 log-severity 命令行参数控制,可接收 verbose、info、warning、error、error-report 和 disabled 值。
  • ResourceDirPath: 资源路径,可由 resources-dir-path 命令行参数控制
  • LocalesDirPath: 本地化信息路径,可由 locales-dir-path 命令行参数控制
  • RemoteDebuggingPort: 可在 1024 - 65535 之间取值,用以启用远程调试,可由另一个 CEF 或谷歌浏览器访问,可由 remote-debugging-port 命令行参数控制。

BrowserSettings

BrowserSettings 覆盖 ChromiumWebBrowser 实例级别的配置,具体参考 BrowserSettings 类型


IBrowser,IFrame 和 IBrowserHost 对象

IBrowser 和 IFrame 对象用于向浏览器发送命令及从回掉函数中接收状态信息,每一个 IBrowser 对象都至少包含一个 IFrame 对象代表顶层窗口。即,如果一个浏览器窗口加载了两个