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


158

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

AwesomiumAwesomium.NET

看起来非常合适,但是我不喜欢该项目不是开源的,并且不容易获得完整的源。同样,这对于我们的项目可能是一个过大的杀伤力,因为屏幕外渲染并不是我们真正依赖的东西。

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

这可能是当前可用的最佳选择。该项目似乎正在运行,目前正在与Chrome v27同步。CEF3使用Chrome多进程架构。看起来Adobe也在认可它。

Google的Chrome内嵌框架

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

WebKit .NET包装器

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

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

如果有人将他/他的经验分享给现实生活中,具有生产质量的WPF项目,我将非常感激。您是否有任何集成,许可或部署方面的内容?谢谢。

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

Answers:


124

您已经列出了嵌入铬的最著名解决方案(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的,因为该项目已是毫无意义的退役


您还忘了说一半的东西都行不通..如清除cookie,缓存..设置代理等。只需使用Awesomium并节省您的麻烦。

4
呵呵,Czarek的回答很好,谢谢您的功劳。:)(到目前为止还没有看到)
Per Lundberg

4
当然,值得指出的是:在任何开源项目中,显然都有“遗漏”的地方。Xilium.CefGlue和CefSharp都不是该规则的任何例外。关于开源的东西的好处是,您实际上可以花一些时间(相当低的时间)来研究一个较小的问题,并包括您的修复程序。我们不时看到CefSharp的情况,而且非常简洁。
Per Lundberg 2013年

1
如果我错了,请纠正我,但是CefSharp是否不需要全部告诉超过50MB的DLL吗?这导致庞大的安装设置。libcef.dll被列为主要依赖文件,它是38MB
Krafty 2015年

2
@Krafty安装设置允许使用7z之类的算法对其进行打包,这会将大小从55 MB->减小到17 MB。与Google Chrome相比,CefSharp的大小并不多,后者的未压缩大小为152 MB,打包的安装大小为40 MB。
Czarek Tomczak 2015年

11

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

首先,CEF的作者本人在此处列出了对不同语言的绑定。

其次,我们继续进行名为Xilium.CefGlue的开源.NET CEF3绑定,并取得了很好的成功。在某些情况下无法正常工作的情况下,作者通常会对内置Bitbucket Tracker中打开的问题反应迅速

到目前为止,它对我们有好处。作者更新了自己的库,以支持最新的CEF3版本和常规漏洞修复。


2
这实际上是一个要点(来自“另一端”,是CefSharp)-由于使用较新的VS工具集支持3.5的问题,CefSharp仅在几个月后才是4.0。(VS2010 +无法使用C ++ / CLI支持较旧的框架,这有点让人伤心,因为它迫使我们使用.NET 4或非常老的Visual Studio版本...)
Per Lundberg 2013年

8

这是另一个:

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

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


支持也很棒。
huseyint 2014年

3
该网站似乎缺少基本信息-它包括什么Chrome版本?
Czarek Tomczak 2014年

2
哦,不是免费的。不是免费的。这些家伙在想什么?:)
dkellner '18

应该在这里预先声明,尽管有试用版,但它不是免费的。
ewilan

8

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

该库继承了Chromium的多进程体系结构–每个网页均在单独的Chromium进程中呈现,并且即使插件崩溃或网页上发生任何其他意外错误,应用程序仍将继续工作。

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

查看API参考以获取更多详细信息。

下面的代码段演示了如何创建BrowserView,将其嵌入到Form中以及加载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");
        }
    }
}

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

在此处输入图片说明

该图书馆是商业图书馆。商业许可证包括针对不同团队规模的支持包。也可以购买库的源代码。

除了自己的页面外,该组件还可以在Visual Studio Marketplace中以NuGet包VSIX包的形式提供。


1
看起来有效,并且我已经将试用版嵌入了我的应用中。唯一的问题是它是一种商业产品,许可证价格不是很便宜。否则,对我来说看起来很扎实。
DoronG

遗憾的是,DotNetBrowser不是免费的!:/
Deniz

4

我使用过Awesomium.NET。尽管我不喜欢它不是开源的事实,也不喜欢它使用相当老的Webkit渲染引擎的事实,但它确实很容易使用。那是我唯一能给予的认可。


1
您能否大致分享该项目的用户群?
noseratio

我从未真正部署过该项目,因此用户数量为零。我只是在自己尝试期权。
Ming Slogar,2013年

2
我花了几个月的时间支持基于Awesomium的C#应用​​程序;对于C ++游戏,它可能会摇摇欲坠,但在C#中,它们的浏览器控制是完全错误的。复杂的部署(您需要他们的怪异的安装程序才能将内容添加到GAC中),错误的行为(有时会以黑屏启动,用户必须手动重新启动应用程序)及其速度较慢(加载时网页不会显示) ,它会一直挂起,直到页面完全/半加载,并且在运行缓慢的计算机上初始化需要5-10秒的时间)
TheFlash 2016年

5
我最终选择了CefSharp,结果令人赞叹。小于100毫秒的初始化(即即时初始化),并且没有“错误”。东西就可以了。正如它应该。另外,不需要将CefSharp添加到GAC中,因此无需更改安装程序。只需复制文件即可。我是否提到CEF / CefSharp比我测试过的每个Mozilla / WebKit C#库都要好?哦,为了天堂,不要使用IE。有用。是的,确实如此,但是它完全缺乏功能,并且表现非常差(速度)。
TheFlash

1
@RobinRodricks也是我的经验。我差点放弃这种方法,但是后来我发现了CefSharp:-)(最近几天,当打印机驱动程序放在DVD上时,谁又在乎几个MB了:
Xan-Kun Clark-Davis


2

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

感谢你的回答。那么您最终是否从Awesomium转到IE?
noseratio

是的,我做到了。我很开心 我使用ClickOnce,因此可部署性很小,而且没有启动冻结!
Sameer Vartak

谢谢,我投票赞成你的答案。顺便说一句,还有另一种获取内部IWebBrowser2接口的方法。
noseratio

凉。Activex控件在WPF中可以工作吗?感谢您的投票:-)
Sameer Vartak

抱歉,没有仔细阅读参考链接。是的,它是一个XAML示例,并且可以正常工作。谢谢。
Sameer Vartak

1

Microsoft将发布“ Microsoft Edge WebView2 ” WPF控件,它将为我们提供一个绝佳的免费选项,可在Windows 10,Windows 8.1或Windows 7上嵌入Chromium 该软件包可通过Nuget获得Microsoft.Web.WebView2


这是一个不错的选择,尽管现在是2020年,而如今我正在寻找一种跨平台的解决方案,例如Chromely
noseratio

1
我认为这取决于您是否要向桌面应用程序或像Web应用程序一样构建的桌面应用程序中添加一些Web内容。我认为,仅当WebView2对台式机应用程序来说只是一点网络内容时,您才使用WebView2。
苏格兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.