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

Posted

技术标签:

【中文标题】使用 WPF/C# 嵌入 Chromium 而不是 IE WebBrowser 控件的选项【英文标题】:Options for embedding Chromium instead of IE WebBrowser control with WPF/C# [closed] 【发布时间】:2013-08-09 18:12:25 【问题描述】:

2020 年更新,我在linked my article 比较了在基本 Windows 桌面应用程序中托管 html WebView 的不同方法的内存占用:

MSEdge WebView2 WPF Chromely/CefSharp Electron v10 Legacy IE11 WebBrowser WPF。

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

Awesomium 和 Awesomium.NET

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

Chromium Embedded Framework (CEF) 和 .NET bindings for CEF

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

Google's Chrome Frame

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

WebKit .NET wrapper

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

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

如果有人分享她/他对上述任何选项的经验,我将不胜感激。您是否有任何集成、许可或部署影响?谢谢。

[已编辑] 我还要感谢 artlung 通过提供慷慨的赏金来推动这个问题。

【问题讨论】:

【参考方案1】:

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

还有Berkelium 项目(参见Berkelium Sharp 和Berkelium Managed),但它嵌入了旧版本的Chromium。

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

Adobe 不是唯一使用 CEF 的主要参与者,请在 CEF wikipedia page 上查看使用 CEF 的其他著名应用程序。

更新Chrome Frame 毫无意义,因为该项目一直是retired。

【讨论】:

你忘了说一半的东西不会起作用..比如清除 cookie、缓存.. 设置代理等。只需使用 Awesomium 就可以省去麻烦。 呵呵,不错的答案 Czarek,感谢您的信任。 :)(直到现在才看到) 当然,值得指出的是:任何开源项目中都可能明显存在“缺失”的东西。 Xilium.CefGlue 和 CefSharp 都不是该规则的任何例外。开源东西的好处是您实际上可以花费(相当少的)时间来研究一个较小的问题,并包含您的修复程序。我们不时在 CefSharp 中看到这一点,而且非常简洁。 如果我错了,请纠正我,但 CefSharp 不要求全部超过 50MB 的 DLL 吗?这导致了巨大的安装设置。 libcef.dll 被列为主要依赖项,大小为 38MB @Krafty 安装设置允许使用 7z 等算法打包它,这导致大小从 55 MB --> 减少到 17 MB。与 Google Chrome 相比,CefSharp 的大小并不多,后者是 152 MB 未打包和 40 MB 安装打包。【参考方案2】:

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

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

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

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

【讨论】:

这实际上是一个观点(来自“另一边”,在这方面是 CefSharp)- CefSharp 仅在几个月后才推出 4.0,因为使用较新的 VS 工具集支持 3.5 存在问题。 (VS2010+ 不能支持带有 C++/CLI 的旧框架,这有点可悲,因为它迫使我们使用 .NET 4 或非常旧的 Visual Studio 版本......)【参考方案3】:

这是另一个:

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

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

【讨论】:

支持也很棒。 该网站上似乎缺少基本信息 - 它包括哪个 Chrome 版本? 呃-哦,不是免费的。不是免费的。这些人在想什么? :) 这里应该先声明,虽然有试用版,但不是免费的。【参考方案4】:

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

【讨论】:

您能否大致分享一下您的用户群对于该项目有多大? 我从未实际部署过该项目,因此用户群为零。我自己只是在尝试各种选项。 几个月来我一直在支持基于 Awesomium 的 C# 应用程序;它可能会为 C++ 游戏而摇滚,但在 C# 中,它们的浏览器控制是彻头彻尾的错误。复杂的部署(你需要他们奇怪的安装程序将东西添加到 GAC 中),错误的行为(有时它以黑屏启动,用户必须手动重新启动应用程序),以及速度慢(网页在加载时不显示,它有点挂起,直到页面完全/半加载,并且在慢速机器上初始化需要 5-10 秒) 我终于选择了 CefSharp,结果令人惊叹。 @RobinRodricks 也是我的经验。我几乎放弃了这种方法,但后来我找到了 CefSharp :-) (现在,当打印机驱动程序出现在 DVD 上时,谁在乎几 MB 呢 :-)?)【参考方案5】:

2018 年 5 月更新:

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

Here is the solution.

【讨论】:

【参考方案6】:

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

但它也很重,即使是发布版本也会增加大约 10-15mb(不记得确切的数字),因此会有轻微的启动损失。然后我意识到,IE 浏览器控件的唯一问题是它会时不时地抛出 JavaScript 错误。但这已通过以下 sn-p 修复。

我几乎没有在 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 );
    

【讨论】:

感谢您的回答。那么你最终是否从 Awesomium 转向 IE? 是的,我做到了。我很高兴。我使用 ClickOnce,所以可部署的东西很小,而且没有启动冻结! 谢谢,我对你的回答投了赞成票。顺便说一句,有another way 来获取内部IWebBrowser2 接口。【参考方案7】:

Microsoft 正在发布“Microsoft Edge WebView2”WPF 控件,它将为我们提供在 Windows 10、Windows 8.1 或 Windows 7 中嵌入 Chromium 的绝佳免费选项。It is available via Nuget as the package Microsoft.Web.WebView2.

【讨论】:

这是一个不错的选择,尽管现在是 2020 年,而这些天我正在寻找一个跨平台的解决方案,例如。 G。 Chromely. 我认为这取决于您是在考虑向桌面应用程序添加一些网络内容还是像网络应用程序一样构建的桌面应用程序。我认为只有当 WebView2 是桌面应用程序的一点网络内容时,您才会使用它。【参考方案8】:

如果你正在考虑商业解决方案,你也可以看看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/

【讨论】:

这与WebView2 或CefSharp 相比有什么优势,既免费又常绿? 如果与 WebView2 相比,DotNetBrowser 具有离屏渲染,可用于克服 WPF 空域问题或无法将浏览器嵌入到已配置 AllowsTransparency 的窗口中。此外,它不依赖预装的浏览器或运行时,而是自带。 CefSharp 在 .NET 进程中初始化 Chromium,这种方法会影响使用的内存,有时还会影响稳定性——如果本机部分出现问题,整个 .NET 进程可能会崩溃。在 DotNetBrowser 中,Chromium 引擎存在于一个单独的进程中,您可以同时初始化和使用多个实例,如果其中一个实例发生问题,有一种方法可以在 .NET 代码中捕获和处理。 DotNetBrowser 还提供了 DOM API,可用于对网页上的 DOM 元素执行相当复杂的操作,不仅包括查找元素,还包括修改属性、填写表单值、点击按钮和引用,以及直接在 .NET 代码中接收/引发 DOM 事件 我认为将这些亮点移到答案本身可能是个好主意。

以上是关于使用 WPF/C# 嵌入 Chromium 而不是 IE WebBrowser 控件的选项的主要内容,如果未能解决你的问题,请参考以下文章

自定义Firefox / Chromium安装预安装扩展(非企业)

Selenium 在 Fedora 35 中使用 chromium 而不是 google-chrome,如何设置 google-chrome?以及如何设置具体的下载文件路径?

温故知新,遇见CefSharp,源于Google官方Chromium嵌入框架的C#版本,让客户端插上Web的翅膀

Chromium和cef的区别

puppeteer 离线安装chromium

linux和winxp,chromium为啥linux占用内存大