用 WPF/C # 嵌入 Chromium 而不是 IE WebBrowser 控件的选项

2020年更新 ,我有 链接我的文章,在那里我比较了在基本的 Windows 桌面应用程序中托管 HTML WebView 的不同方法的内存占用情况:


基于 InternetExplorer 的 WPFWebBrowser 控件受到一些 键盘和焦点问题内存泄漏问题的影响。作为这些问题的替代解决方案,我们正在考虑在基于 HTML 编辑的 WPF/C # 项目中托管 Chromium 而不是 WebBrowser 控件的可用选项。类似的问题以前也有过 问道。我已经阅读了答案并且做了自己的研究,但我希望从那些在生产质量项目中实际使用过以下选项的人那里获得更多的反馈:

Awesomium 和 Awesomium.NET

它看起来非常合适,但是我不喜欢这个项目不是开源的,而且完整的源代码也不容易获得。另外,对于我们的项目来说,这可能是一种过度消耗,因为离屏渲染并不是我们真正依赖的东西。

Chromium 嵌入式框架(CEF) 和 < a href = “ https://github.com/cefSharp/CefSharp”rel = “ noReferrer”> . NET 绑定用于 CEF

这可能是目前最好的选择。该项目似乎是活跃的,目前与 Chrome v27同步。CEF3使用 Chrome 多进程架构。看起来 Adobe 也给了它 一些背书

谷歌的 Chrome 框架

虽然它最初的目的是为 IE 和 Firefox 提供一个 HTML5插件,但实际上它也可以作为独立的 ActiveX 控件工作,所以我可以把它包装起来以便与 WPF 一起使用。它为与内部网页(onmessage, addEventListener/removeEventListener, postMessage)的交互公开了一个 空气污染指数足够。 我知道谷歌是对 停止 Chrome 帧,但我认为源代码将保留在 Chromium 存储库。随着我们的进展,用最新的 Chromium 代码来更新它应该不会很困难,而且我们可以完全控制这一点。

WebKit. NET 包装器

不完全基于 Chromium,也不使用 V8引擎,所以它不是一个真正的选项。

还有什么我没注意到的选择吗?

如果有人分享她/他的经验与任何上述选项的现实生活中,生产质量的 WPF 项目,我将非常感激。您是否有任何集成、许可或部署方面的影响?

148974 次浏览

我用过 Awesomium.NET。尽管我不喜欢它不开源的事实,也不喜欢它使用一个相当老的 Webkit 渲染引擎的事实,但它真的很容易使用。这是我唯一的支持。

我们之前也遇到过同样的挑战。我们希望使用 CEF3开源库,它是基于 WPF 的并且支持。NET 3.5.

首先,CEF 的作者自己列出了不同语言 给你的绑定。

其次,我们继续推进开源。NET CEF3绑定,简称 Xilium CefGlue,并取得了良好的效果。在某些情况下,如果某些东西不能像您期望的那样工作,作者通常会对内置 比特桶追踪器中打开的问题非常敏感

到目前为止,它对我们很有帮助。作者定期更新他的库以支持最新的 CEF3版本和 bug 修复。

我的 WPF RSS 阅读器也有同样的问题,我最初使用 Awesomium (我认为版本1.6) Awesomium 很棒。您可以在缓存(图像和 HTML 内容)、 JavaScript 执行、拦截下载等方面获得很多控制。而且超级快。这个进程隔离意味着,当浏览器崩溃时,应用程序不会崩溃。

但是它也很重,即使发布版本增加了大约10-15mb (记不清确切的数字) ,因此启动时会有轻微的损失。然后我意识到,IE 浏览器控制的唯一问题是它会时不时地抛出 JavaScript 错误。但下面的代码片段修复了这个问题。

我几乎不在 XP 或 Vista 上使用我的应用程序,但在 Win 7及以上版本上它从未崩溃过(至少不是因为我使用了 IE 浏览器控制)

IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != null)
{
IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");


webBrowser;
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
if (webBrowser != null)
{
webBrowser.GetType().InvokeMember("Silent",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
}
}

您已经列出了最著名的嵌入 Chromium 的解决方案(CEF、 ChromeFrame、 Awesomium)。已经没有什么重要的项目了。

现在仍然有 项目(参见 伯克利姆尖锐伯克利管理公司) ,但是它嵌入了一个旧版本的 Chromium。

CEF 是您最好的选择——它是完全开源的,并且经常更新。这是唯一允许你嵌入最新版 Chromium 的选项。现在 Per Lundberg 正在积极地将 CEF 3移植到 CefSharp,这是未来的最佳选择。还有 Xilium CefGlue,但是这一个为 CEF 提供了一个低级 API,它绑定到 CEF 的 C API。另一方面,CefSharp 绑定到 CEF 的 C + + API。

Adobe 并不是唯一使用 CEF 的主要玩家,请参阅 CEF 维基百科页面上使用 CEF 的其他值得注意的应用程序。

更新 铬框是没有意义的,因为该项目已经是 退休了

还有一个:

Http://www.essentialobjects.com/products/webbrowser/default.aspx

这一个也是基于最新的 Chrome 引擎,但它比 CEF 更容易使用。是单人间。NET dll,您可以简单地引用和使用。

2018年5月更新:

或者,您可以嵌入 Edge 浏览器,但只能针对 Windows10。

这就是解决办法。

微软发布了“ MicrosoftEdge WebView2”WPF 控件,这将为我们提供一个在 Windows 10、 Windows 8.1或 Windows 7上嵌入 Chromium 的很棒的免费选项。可以通过 Nuget 购买。

如果您正在考虑商业解决方案,您也可以看看 DotNetBrowser

它有很多特性可以用于深度集成(例如,DOM 支持、 JavaScript 执行、调用。NET 对象从 JavaScript,网络和 Cookie 处理,从代码打印网页)。它基于最新的 Chromium 引擎,并支持广泛的。NET 实现,从。NET Framework 4.5至。NET 6.支持 WPF 和 Windows 窗体。

下面是一个包含示例的存储库,它演示了如何在各种场景中使用它: Https://github.com/teamdev-ip/dotnetbrowser-examples

它也可以在 NuGet 上获得: Https://www.nuget.org/packages/dotnetbrowser/