基于Internet Explorer的WPF WebBrowser控件受到一些keyboard and focus issues和memory leak issues的影响。作为这些问题的替代解决方案,我们正在考虑在基于HTML编辑的WPF / C#项目中托管Chromium而不是WebBrowser控件的可用选项。此前有类似的问题asked。我已经阅读了答案并完成了我自己的研究,但我希望从生产质量项目中实际使用以下任何选项的人那里获得更多反馈:
它看起来非常合适,但我不喜欢这个项目不是开源的事实,并且不能轻易获得完整的源代码。此外,它可能对我们的项目来说太过分了,因为屏幕外渲染不是我们真正依赖的东西。
Chromium Embedded Framework (CEF)和.NET bindings for CEF
这可能是目前可用的最佳选择。该项目似乎活跃且活跃,目前与Chrome v27同步。 CEF3使用Chrome多进程架构。看起来Adobe似乎正在给它some endorsement。
虽然它的最初目的是成为IE和Firefox的HTML5插件,但它实际上也可以作为独立的ActiveX控件使用,所以我可以将它包装起来用于WPF。它公开了sufficient API与内部网页(onmessage, addEventListener/removeEventListener, postMessage
)的互动。
我知道Google要discontinue Chrome Frame,但我认为这些来源将保留在Chromium存储库中。使用最新的Chromium代码更新它并不困难,我们可以完全控制它。
不完全是基于Chromium的,并且不使用V8引擎,所以它不是一个真正的选择。
我可能忽略了其他任何选择吗?
如果有人与上述任何选项分享她/他在实际生产质量WPF项目中的经验,我将不胜感激。您是否有任何集成,许可或部署影响?谢谢。
[EDITED] 我还要感谢artlung通过提供慷慨的赏金提议来提升这个问题。
答案 0 :(得分:115)
您已经列出了最值得注意的嵌入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毫无意义。
答案 1 :(得分:11)
前一段时间我们遇到了完全相同的挑战。我们想要使用基于WPF的CEF3开源库并支持.NET 3.5。
首先,CEF的作者自己列出了不同语言的绑定here。
其次,我们继续使用开源.NET CEF3绑定,称为Xilium.CefGlue,并取得了很好的成功。如果某些内容无法按预期运行,作者通常会对内置bitbucket tracker
中打开的问题做出快速响应到目前为止,它对我们有好处。作者更新他的库以支持最新的CEF3版本和常规基础上的错误修复。
答案 2 :(得分:9)
这是另一个:
http://www.essentialobjects.com/Products/WebBrowser/Default.aspx
这个也基于最新的Chrome引擎,但它比CEF更容易使用。它只是一个.NET dll,您可以简单地引用和使用它。
答案 3 :(得分:8)
查看我所属团队开发的DotNetBrowser库。它提供了基于Chromium的WPF和WinForms浏览器控件,它们很容易嵌入到.NET应用程序中。它支持所有现代Web标准,包括HTML5,CSS3和JavaScript。呈现的页面与Google Chrome中的内容完全相同。
该库继承了Chromium的多进程架构 - 每个网页都在一个单独的Chromium进程中呈现,即使在插件崩溃或网页上发生任何其他意外错误之后,应用程序仍将继续工作。
以下是DotNetBrowser提供的一些其他有用功能:可以监听加载事件,处理网络活动,配置代理,模拟用户操作,使用cookie,访问和修改DOM,监听DOM事件,调用JavaScript从.NET开始,反之亦然,在网页上使用网络摄像头和麦克风,设置基于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");
}
}
}
运行上面的示例后,您将获得以下输出:
图书馆是商业图书馆,但它可以在开源和学术项目中免费使用。商业许可证包括针对不同团队规模的支持包。也可以购买图书馆的源代码。
除了自己的页面外,该组件在Visual Studio Marketplace中以NuGet package和VSIX package的形式提供。
答案 4 :(得分:5)
我使用过Awesomium.NET。虽然我不喜欢它不是开源的事实,而且它也使用了一个非常古老的Webkit渲染引擎这一事实,但它真的很容易使用。这是我能给予它的唯一认可。
答案 5 :(得分:3)
答案 6 :(得分:2)
我的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 });
}
}
答案 7 :(得分:2)
Microsoft发布了“ Microsoft Edge WebView2” WPF控件,它将为我们提供一个绝佳的免费选项,可以在Windows 10,Windows 8.1或Windows 7中嵌入Chromium。It is available via Nuget as the package Microsoft.Web.WebView2
.