selectembeddedChromium而不是IE浏览器WebBrowser控件与WPF / C#
基于Internet Explorer的WPF WebBrowser控件受到某些键盘和焦点问题以及内存泄漏问题的困扰 。 作为这些问题的替代解决scheme,我们正在考虑在基于HTML编辑的WPF / C#项目中提供用于托pipeChromium而不是WebBrowser控件的可用选项。 之前也有类似的问题。 我已经阅读了答案并完成了自己的研究, 但是我希望从那些在生产质量项目中实际使用以下任何选项的人那里获得更多的反馈意见 :
Awesomium和Awesomium.NET
它看起来非常合适,但是我不喜欢这个项目不是开放源代码,而且整个源代码也不容易获得。 另外,对于我们的项目来说,这可能是一种矫枉过正,因为离屏渲染并不是我们真正依赖的。
Chromiumembedded式框架(CEF)和CEF的 .NET绑定
这可能是目前可用的最佳select。 该项目似乎是活跃的,目前与Chrome v27同步。 CEF3使用Chrome多进程架构。 它也看起来像Adobe给它一些认可 。
Google的Chrome框架
虽然它的最初目的是成为IE和Firefox的HTML5插件,但它实际上也是作为独立的ActiveX控件工作的,所以我可以把它包装起来用于WPF。 它公开了一个足够的API来与内部网页交互( onmessage, addEventListener/removeEventListener, postMessage
)。 我知道谷歌将停止 Chrome框架,但我认为源将保留在Chromium存储库。 在我们去的时候用最新的Chromium代码来更新它并不难,我们将完全控制它。
WebKit .NET包装
不完全是基于铬,不使用V8引擎,所以它不是一个真正的select。
有没有其他的select,我可能忽略了?
如果有人将他/他的经验与上述任何一种scheme分享给现实生产质量的WPF项目,我将不胜感激。 您是否有任何集成,许可或部署影响? 谢谢。
[编辑]我还要感谢artlung提供了一个慷慨的赏金提供这个问题。
您已经列出了embeddedChromium(CEF,Chrome Frame,Awesomium)最显着的解决scheme。 没有更多的项目是重要的。
还有Berkelium项目(请参阅Berkelium Sharp和Berkelium Managed ),但它还包含旧版本的Chromium。
CEF是你最好的select – 它是完全开源的,经常更新。 这是唯一允许embedded最新版本的Chromium的选项。 现在Per Lundberg正在积极将CEF 3移植到CefSharp ,这是未来的最佳select。 还有Xilium.CefGlue ,但是这个为CEF提供了一个低层次的API,它绑定了CEF的C API。 CefSharp另一方面绑定到CEF的C ++ API。
Adobe不是唯一使用CEF的主要参与者,请参阅CEF维基百科页面上使用CEF的其他值得注意的应用程序。
由于项目已经停用,更新Chrome Frame毫无意义。
前段时间我们也遇到了同样的挑战。 我们想要使用基于WPF的CEF3开源库,并支持.NET 3.5。
首先,CEF的作者本人在此列出了针对不同语言的绑定。
其次,我们继续开发了.NET CEF3绑定,名为Xilium.CefGlue ,取得了很好的成效。 如果某些内容不能像您期望的那样工作,那么作者通常会对内置bitbucket跟踪器中打开的问题做出响应
到目前为止它已经为我们提供了很好 作者更新他的库以支持最新的CEF3版本和常规基础上的错误修复。
这是另一个:
http://www.essentialobjects.com/Products/WebBrowser/Default.aspx
这也是基于最新的Chrome引擎,但比CEF更容易使用。 这是一个单一的.NET DLL,你可以简单地引用和使用。
看看DotNetBrowser库。 它提供了基于Chromium的WPF和WinForms浏览器控件,这些控件很容易embedded到.NET应用程序中。 它支持所有的现代Web标准,包括HTML5,CSS3和JavaScript。 呈现的页面在Google Chrome浏览器中看起来完全一样。
该库inheritance了Chromium的多进程架构 – 每个网页都在一个单独的Chromium进程中呈现,即使在插件崩溃或网页出现任何其他意外错误之后,该应用程序仍将继续工作。
以下是DotNetBrowser提供的其他一些有用的function:可以监听加载事件,处理networking活动,configuration代理,模拟用户操作,使用cookie,访问和修改DOM,监听DOM事件,从.NET调用JavaScript。反之亦然,在网页上使用networking摄像头和麦克风,build立基于WebRTC的通信, 等等 。
查看API参考了解更多详情。
下面的代码片段演示了如何创build一个BrowserView,将其embedded到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"); } } }
一旦你运行上面的例子,你会得到以下输出:
这个图书馆是商业的,但是它可以在开放源代码和学术项目中免费使用。 商业许可包括不同团队规模的支持包。 也可以购买图书馆的源代码。
除了自己的页面之外,组件还可以作为NuGet包和Visual Studio Marketplace中的VSIX包提供。
我已经使用Awesomium.NET。 虽然我不喜欢它不是开放源代码的事实,而且它使用了一个很老的Webkit渲染引擎的事实,但使用起来却非常简单。 这是我能给的唯一的背书。
我和我的WPF RSS阅读器有同样的问题,我原来是用Awesomium(我认为1.6版本)Awesomium是伟大的。 对caching(图像和HTML内容),JavaScript执行,拦截下载等有很多控制。 这也是超级快。 进程隔离意味着浏览器崩溃时不会崩溃应用程序。
但它也很重,甚至发布版本增加约10-15mb(不记得确切的数字),因此轻微的启动罚款。 然后我意识到,只有IE浏览器控制的问题是,它会每隔一段时间抛出JavaScript错误。 但是,这是固定的以下片段。
我很less在XP或Vista上使用我的应用程序,但在Win 7及以上,它从来没有崩溃(至less不是因为我使用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 }); } }