CefSharp与WebView2的比较

11

我考虑将一个项目从cef (CefSharp) 迁移到 WebView2 WPF。我的初步测试显示,WebView2 API 具有我需要的接口,可以完成此移植。我担心可能会错过某些阻止我转换到 WebView2 的东西,而且我只能在这个转换的后期发现这一点。如果有人已经经历了这个过程,请分享是否需要注意可能成为这个迁移的障碍物的任何事情。在 WebView2 中是否缺少重要的 cef API?


5
在SO上搜索“+CefSharp [WebView2]”,那里会有相关的问题和答案。 - Poul Bak
2个回答

9

这个问题在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窗口中摆脱炫耀的东西并将其嵌入到应用程序中。我们称之为“窗口化”或“重量级”模式。另一种方法是在内存中呈现Web内容并在任意表面上绘制它。这被称为“离屏渲染”。

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

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

CefSharp评分。

自动化

自动化的核心是模拟用户输入。CefSharp具有API,用于向浏览器分派“真实”的鼠标和键盘事件。浏览器将这些事件处理为用户手势,并且JavaScript无法区分它们和真正的人类输入。请查看IBrowserHost中的SendMouse*SendKey*方法。
WebView2中没有此类API,只有基于Win API的解决方法
对于CefSharp来说,这是一个得分。
沙箱
默认情况下,所有Chromium进程都被沙箱化了。这使它们更加安全。Chromium团队在这里详细解释了沙箱。
WebView2和其他外部进程库也被沙箱化了。

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

WebView2的得分。

另请参阅


给这个人一个饼干! - ekalchev
1
就算不值得一提,如果需要的话,CefSharp也可以在外部进程中运行,这里有一个概念验证可供参考:CefSharp.OutOfProcess - amaitland

4
除了其他答案,我还要补充一些额外的观点。
许可证
CefSharp是开源的,采用3-BSD许可证。您可以自定义代码、修复错误、提交拉取请求等。
WebView2目前不是开源的。您需要等待Microsoft修复错误。目前,WebView2团队每四周发布更新。即使一个错误被快速修复,您也可能要等几周才能发布。
隐私
WebView2:数据收集隐私通知(在撰写本文时)。
该软件可能会收集有关您和您的最终用户对软件的使用情况的信息,并将其发送给Microsoft。Microsoft可以使用这些信息来提供服务并改进我们的产品和服务。软件中还有一些功能可以使您收集应用程序用户的数据。如果您使用这些功能来启用应用程序中的数据收集,您必须遵守适用法律,包括向应用程序用户提供适当的通知。您可以在帮助文档和https://aka.ms/privacy的隐私声明中了解更多有关数据收集和使用的信息。您使用该软件即表示您同意这些做法。
Microsoft尚未披露具体捕获了什么。用户必须选择退出数据收集。
许多用户对数据遥测提出了担忧。有关隐私问题的讨论可以在此处此处找到。
分发模型

CefSharpWebView2都需要在计算机上安装/复制一个专门的版本的Chromium

固定版本:一个固定版本的Chromium与您的应用程序捆绑在一起。您可以控制哪个版本。 常青:在某些操作系统上,Chromium会被预先安装,然后通过Windows更新自动更新。目前对运行时是否更新有限制/无控制权。

  CefSharp WebView2
固定 [x] [x]
常青 [x]
“Chromium”正在快速变化,截至目前每四周就会发布一个新的主要版本。每个主要版本的发布都会添加或删除功能,并更改安全策略。出于安全原因,在先前版本的“Chromium”上运行得完美的功能可能已不再被允许使用。经常会移除过时的功能。
对于复杂的应用程序来说,测试应该针对您的应用程序所使用的特定版本的“Chromium”。这适用于所有基于“Chromium”的浏览器。
通过“Windows Update”自动更新的“Evergreen WebView2 Runtime”听起来很完美,无需做任何操作即可获得最新版本。当某个错误进入了“稳定版”时会发生什么?您是否测试了您的应用程序以检测即将出现的问题而使用“dev/beta”渠道?没有吗?您可能会受到用户投诉,因为他们的应用程序现在崩溃了。
通过查看“WebView2Feedback Issue Tracker”,您可以快速了解到这种情况的例子。
M108发布时出现了很多问题,许多用户报告了问题。以下仅是一些例子。 对于使用“常青”模型的人,您必须在每个dev/beta发布版上测试您的应用程序,以确保您的应用程序按预期工作。

WPF

CefSharp提供两种WPF实现。第一种CefSharp.Wpf将每个帧呈现为位图,这允许进行本地WPF体验。您可以应用变换、在顶部覆盖元素等。没有空域问题。有一些缺点,主要是性能较低(有一些事情可以做来挤出一些额外的帧)。 第二种是CefSharp.Wpf.HwndHost,它是基于HwndHost的实现,就像在WPF中嵌入WinForms版本,并支持绑定,您可以获得更好的性能,没有变换,不能在顶部叠加。空域问题适用。

WebView2 目前仅提供 HwndHost 实现,存在空域问题。有传言提供更本机 WPF 实现


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接