168

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


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

AwesomiumAwesomium.NET

它看起来很合适,但我不喜欢这个项目不是开源的,而且完整的源代码不容易获得。此外,这对我们的项目来说可能有点过头了,因为离屏渲染并不是我们真正依赖的东西。

Chromium Embedded Framework (CEF)和CEF的 .NET 绑定

这可能是目前可用的最佳选择。该项目似乎很活跃,目前与 Chrome v27 同步。CEF3 使用 Chrome 多进程架构。看起来 Adob​​e 也给了它一些支持

谷歌的 Chrome 框架

虽然它最初的目的是成为一个用于 IE 和 Firefox 的 HTML5 插件,但它实际上也可以作为独立的 ActiveX 控件工作,因此我可以将它包装起来与 WPF 一起使用。它公开了足够的 API来与内部网页 ( onmessage, addEventListener/removeEventListener, postMessage) 进行交互。我知道 Google 将停止使用Chrome Frame,但我认为源代码将保留在 Chromium 存储库中。使用最新的 Chromium 代码更新它应该不难,我们可以完全控制它。

WebKit .NET 包装器

不完全基于 Chromium 并且不使用 V8 引擎,因此它不是一个真正的选择。

还有其他我可能忽略的选择吗?

如果有人分享她/他对现实生活中的生产质量 W​​PF 项目的上述任何选项的经验,我将不胜感激。您是否有任何集成、许可或部署影响?

4

8 回答 8

130

您已经列出了最值得注意的嵌入 Chromium 的解决方案(CEF、Chrome Frame、Awesomium)。没有其他重要的项目了。

仍然有Berkelium项目(请参阅Berkelium SharpBerkelium Managed),但它嵌入了旧版本的 Chromium。

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

Adobe 不是唯一使用 CEF 的主要参与者,请在CEF 维基百科页面上查看使用 CEF 的其他著名应用程序。

由于该项目已退役,因此更新Chrome Frame毫无意义。

于 2013-08-22T12:25:53.067 回答
10

前段时间我们遇到了完全相同的挑战。我们想使用基于 WPF 并支持 .NET 3.5 的 CEF3 开源库。

首先,CEF 的作者自己在这里列出了不同语言的绑定。

其次,我们继续使用名为Xilium.CefGlue的开源 .NET CEF3 绑定并取得了很好的成功。如果某些事情没有按您的预期工作,作者通常会对内置bitbucket 跟踪器中打开的问题非常敏感

到目前为止,它为我们服务得很好。作者定期更新他的库以支持最新的 CEF3 版本和错误修复。

于 2013-08-19T08:37:41.683 回答
7

这是另一个:

http://www.essentialobjects.com/Products/WebBrowser/Default.aspx

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

于 2014-01-06T18:52:54.097 回答
4

我用过 Awesomium.NET。虽然我不喜欢它不是开源的,也不喜欢它使用了相当老的 Webkit 渲染引擎,但它真的很容易使用。这是我能给予的唯一认可。

于 2013-08-16T21:29:09.587 回答
3

2018 年 5 月更新:

或者,您可以嵌入 Edge 浏览器,但仅针对 Windows 10。

这是解决方案。

于 2018-05-11T06:16:07.510 回答
2

我的 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 });
    }
}
于 2013-08-21T11:25:17.390 回答
2

Microsoft 正在发布“ Microsoft Edge WebView2 ”WPF 控件,它将为我们提供在 Windows 10、Windows 8.1 或 Windows 7 中嵌入 Chromium 的绝佳免费选项。它可以通过 Nuget 作为包获得Microsoft.Web.WebView2

于 2020-05-15T20:33:04.640 回答
1

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

它有许多可用于深度集成的功能(例如 DOM 支持、JavaScript 执行、从 JavaScript 调用 .NET 对象、网络和 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/

于 2021-11-19T07:08:46.133 回答