首页 文章

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

提问于
浏览
144

基于Internet Explorer的WPF WebBrowser控件受到一些keyboard and focus issuesmemory leak issues的影响 . 作为这些问题的替代解决方案,我们正在考虑在基于HTML编辑的WPF / C#项目中托管Chromium而不是WebBrowser控件的可用选项 . 此前类似的问题已在此处进行过 . 我已经阅读了答案并完成了自己的研究, but I hope to obtain some more feedback from people who have actually used any of the following options in production-quality projects

AwesomiumAwesomium.NET

它看起来非常合适,但我不喜欢这个项目不是开源的事实,并且不能轻易获得完整的资源 . 此外,它可能对我们的项目来说太过分了,因为屏幕外渲染不是我们真正依赖的东西 .

Chromium Embedded Framework (CEF).NET bindings for CEF

这可能是目前可用的最佳选择 . 该项目似乎活跃且活跃,目前与Chrome v27同步 . CEF3使用Chrome多进程架构 . 它看起来像Adobe正在给它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引擎,所以它不是一个真正的选择 .

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

I would greatly appreciate if someone shared her/his experience with any of the above options for a real-life, production-quality WPF project. Did you have any integration, licensing, or deployment implications? Thank you.

[EDITED] 我还要感谢artlung通过提供慷慨的赏金提议来提升这个问题 .

7 回答

  • 8

    您已经列出了嵌入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 wikipedia page上使用CEF的其他值得注意的应用程序 .

    更新Chrome Frame是没有意义的,因为该项目已经retired .

  • 5

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

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

    其次,我们继续开源.NET CEF3绑定,称为Xilium.CefGlue,并取得了很好的成功 . 如果某些内容无法按照您的预期运行,作者通常会对内置中打开的问题做出快速响应bitbucket tracker

    到目前为止,它一直很好 . 作者更新他的库以支持最新的CEF3版本和常规基础上的错误修复 .

  • 3

    这是另一个:

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

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

  • 111

    看看我所属的团队开发的DotNetBrowser库 . 它提供了基于Chromium的WPF和WinForms浏览器控件,它们很容易嵌入到.NET应用程序中 . 它支持所有现代Web标准,包括HTML5,CSS3和JavaScript . 呈现的页面与Google Chrome中的内容完全相同 .

    该库继承了Chromium的多进程架构 - 每个Web页面都在一个单独的Chromium进程中呈现,即使在插件崩溃或网页上发生任何其他意外错误之后,应用程序仍将继续工作 .

    以下是DotNetBrowser提供的一些其他有用功能:可以监听加载事件,处理网络活动,配置代理,模拟用户操作,使用cookie,访问和修改DOM,监听DOM事件,从.NET调用JavaScript反之亦然,在网页上使用网络摄像头和麦克风,设置基于WebRTC的通信,以及more .

    查看API Reference了解更多详情 .

    下面的代码片段演示了如何创建BrowserView,将其嵌入到表单中,并加载URL:

    using System.Windows.Forms;
    using DotNetBrowser;
    using DotNetBrowser.WinForms;
    
    namespace WinForms.DotNetBrowser
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                BrowserView browserView = new WinFormsBrowserView();
                Controls.Add((Control) browserView);
                browserView.Browser.LoadURL("http://www.youtube.com");
            }
        }
    }
    

    运行上面的示例后,您将获得以下输出:

    enter image description here

    该图书馆是商业图书馆,但它可以免费用于开源和学术项目 . 商业许可证包括针对不同团队规模的支持包 . 也可以购买图书馆的源代码 .

    除了自己的页面,该组件在NuGet package和Visual Studio Marketplace中的VSIX package中可用 .

  • 2

    我使用过Awesomium.NET . 虽然我不喜欢它不是开源的事实,而且它也使用了一个非常古老的Webkit渲染引擎这一事实,但它真的很容易使用 . 这是我能给予它的唯一认可 .

  • 8

    更新2018年5月:

    或者,您可以嵌入Edge浏览器,但只能嵌入Windows 10 .

    Here is the solution.

  • 11

    我的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 });
        }
    }
    

相关问题