CefSharp 与 WebView2

eka*_*hev 12 chromium-embedded cefsharp webview2

我正在考虑将项目从 cef (CefSharp) 迁移到 WebView2 WPF。我的初步测试表明 WebView2 API 具有我需要的该端口的接口。我担心我会错过一些可能阻止我切换到 WebView2 的东西,我会在过渡的后期阶段解决这个问题。如果有人经历过这个过程,请分享我是否需要了解可能成为此过渡的障碍的事情。WebView2 中是否缺少来自 cef 的重要 API?

Vla*_*kiy 10

WebView2 的 Github 中的这个问题部分回答了你的问题。我想补充一下我的看法。

总结:

  • WebView2没有用于模拟用户输入的API,它不适合自动化。
  • WebView2 无法在屏幕外渲染。不能在控制台中作为服务在服务器上运行。
  • WebView2运行在一个单独的进程中;CefSharp 在应用程序的进程中运行。
  • WebView2有一个沙箱;CefSharp 没有。

这个答案是基于我的个人经验,并不是详尽的比较。

过程模型

Chromium进程模型有进程和许多辅助进程。当然,这是一种赤裸裸的简化,但它可以做到。

CefSharp 和 WebView2 都遵循这一过程模型,但有一个非常显着的区别。CefSharp 在应用程序的进程中启动 Chromium,而 WebView2 将其作为单独的进程启动。

进程内模型对于所有基于 CEF 的浏览器都是通用的。优点:浏览器启动速度更快。缺点:

  • 如果 CEF 崩溃,应用程序也会随之崩溃。
  • 如果 CEF 或 Chromium 中存在漏洞,它也可能会暴露应用程序的内存。

进程外模型在专有浏览器中很流行。不仅 WebView2 以这种方式工作,DotNetBrowserEO.WebBrowser也以这种方式工作。优点:

  • 这样更安全。
  • 它不会占用应用程序的 RAM。缺点:
  • 开始时间更长。
  • 由于进程间通信,它可能会更慢。
  • 有时,由于浏览器窗口属于另一个进程,焦点和拖放会出现问题。但不适用于离屏渲染。

CefSharp进程模型WebView2 流程模型

WebView2 的分数。

离屏渲染

有两种呈现嵌入式 Web 内容的方法。一种是摆脱实际 Chromium 窗口的花哨功能,并将其嵌入到应用程序中。我们称之为“窗口”或“重量级”模式。另一种方法是在内存中渲染网页内容并将其绘制在任意表面上。这称为“离屏渲染”。

WebView2 仅支持窗口渲染。这种模式有两个显着的缺点:它需要一个窗口才能运行,并且浏览器始终保持在顶部(也称为空域问题)。

CefSharp 还具有离屏渲染功能。它允许应用程序在控制台中运行、将网页内容与其他控件叠加、在 Unity3D 中渲染网页内容等。

CefSharp 的得分。

自动化

自动化的基础是模拟用户输入。CefSharp 有一个 API,用于将“真实”鼠标和键盘事件分派到浏览器。浏览器将这些事件作为用户手势来处理,而 JavaScript 无法区分它们和真实的人类输入。查看IBrowserHostSendMouse*中的和SendKey*方法。

WebView2中没有这样的API,只有基于Win API的解决方法。

CefSharp 的得分。

沙盒

默认情况下,所有 Chromium 进程都是沙盒的。这让他们更加安全。Chromium 团队在这里详细解释了沙箱。

WebView2 和其他进程外库也被沙箱化。

CefSharp 不支持沙箱,而且似乎永远不会支持(#697)。

WebView2 的分数。

也可以看看