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

本文关键字:IE WebBrowser 控件 选项 WPF 嵌入 Chromium 使用 | 更新日期: 2023-09-27 18:26:46

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

  • MSEdge WebView2 WPF
  • Chromey/CefSharp
  • Electron v10
  • 旧版IE11 Web浏览器WPF

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

真棒和真棒.NET

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

Chromium嵌入式框架(CEF)和用于CEF 的.NET绑定

这可能是目前可用的最佳选项。该项目似乎是活跃的,目前正在与Chrome v27同步。CEF3使用Chrome多进程架构。看起来Adobe也在为它背书。

谷歌的Chrome框架

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

WebKit.NET包装

不完全基于铬,也不使用V8发动机,所以它不是一个真正的选择。

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

如果有人能分享她/他的经验,为现实生活中的、高质量的WPF项目提供上述任何选择,我将不胜感激。您是否有任何集成、许可或部署方面的影响

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

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

Berkelium项目仍然存在(参见Berkelium Sharp和Berkelium Managed),但它让人想起了Chromium的旧版本。

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

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

更新Chrome框架毫无意义,因为该项目已经退役。

我们不久前也遇到了同样的挑战。我们希望使用基于WPF并支持.NET3.5的CEF3开源库。

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

其次,我们进行了开源.NET CEF3绑定,它被称为Xilium.CefGlue,并取得了良好的成功

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

这是另一个:

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

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

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

2018年5月更新:

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

这是解决方案。

我的WPF RSS阅读器也有同样的问题,我最初使用的是Awesomium(我认为1.6版)Awesodium很棒。您可以对缓存(图像和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 });
    }
}

Microsoft发布了"Microsoft Edge WebView2"WPF控件,它将为我们提供一个在Windows 10、Windows 8.1或Windows 7中嵌入Chromium的免费选项。它可以通过Nuget作为包Microsoft.Web.WebView2提供。

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

它有很多功能可以用于深度集成(例如DOM支持、JavaScript执行、从JavaScript调用.NET对象、网络和cookie处理、从代码打印网页)。它基于最新的Chromium引擎,支持从.NET Framework 4.5到.NET 6的各种.NET实现。同时支持WPF和Windows窗体。

以下是一个包含示例的存储库,这些示例演示了如何在各种场景中使用它:https://github.com/TeamDev-IP/DotNetBrowser-Examples

它也可在NuGet上获得:https://www.nuget.org/packages/DotNetBrowser/