最近有一个项目,需要在winform中嵌套web网站,从网上了解到几个相关的组件有winform自带的IE内核的WebBrowser,有第三方组件谷歌内核的webkit、cefsharp、chromiumfx等。
开始为了方便使用WebBrowser,发现有些css样式和js无效(毕竟是ie内核,可以理解),接着用webkit发现有些css和js同样是无效,后来在网上搜索一番,发现cefsharp口碑相对不错,那么就用它了。
其中在使用过程中也是遇到了不少坑,最为典型的就是加载网页特别慢,不过后来也得到了解决办法,本文中会有提到。
一、首先创建个winform程序。
二、使用NuGet包导入CefSharp.WinForms
三、在前台拖动一个Panel容器,用于显示网站。
四、开始编写后台代码,需要添加
using CefSharp; using CefSharp.WinForms; using System; using System.Windows.Forms; namespace CefSharpDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitBrowser(); } public ChromiumWebBrowser browser; public void InitBrowser() { try { Cef.Initialize(new CefSettings()); browser = new ChromiumWebBrowser("http://www.baidu.com"); browser.Parent = panel1; browser.Dock = DockStyle.Fill; browser.FrameLoadEnd += new EventHandler<FrameLoadEndEventArgs>(FrameEndFunc); } catch (Exception ex) { } } private void FrameEndFunc(object sender, FrameLoadEndEventArgs e) { //下面替换成你要调用html JS 方法的算法过程。 其中EvaluateScriptAsync为调用JS的方法 //string data = "参数"; //string info = "test0624()"; //我的JS 方法是initValue //this.browser.EvaluateScriptAsync(info); } } }
这时,你生成项目会发现报错。
看到错误日志我们就明白了,需要把生成改为x86或者x64位,这里我改为x86。
再次运行就ok了,但是你还会发现加载网页为什么这么慢呢?
五、解决CefSharp嵌入网站加载过慢的问题。
定位后发现很多是因为设置系统代理所致,此时可以通过如下启动参数禁止系统代理。
{"proxy-auto-detect", "0"}, {"no-proxy-server", "1"},
我们把这配置参数加载启动进程Program里,代码如下:
using CefSharp; using CefSharp.WinForms; using System; using System.IO; using System.Windows.Forms; namespace CefSharpDemo { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { /*配置浏览器属性*/ var settings = new CefSettings() { Locale = "zh-CN", CachePath = Directory.GetCurrentDirectory() + @"\Cache" }; settings.CefCommandLineArgs.Add("proxy-auto-detect", "0"); settings.CefCommandLineArgs.Add("no-proxy-server", "1"); /*初始化配置*/ Cef.Initialize(settings); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }
运行查看:
切记:需要注释掉其他 new CefSettings(),否则会报错,无法加载网站(注释掉本案例中Form1中的 "Cef.Initialize(new CefSettings());" ),原因是:每个进程只能初始化一次CEF。这是底层CEF/Chromium框架的一个限制。
本想着附带源码放在百度云盘上,后来发现目标文件太大了(300+M),代码倒是没几行,主要是CefSharp的组件容量大,如果程序哪里有问题,大家可以留言或者拍砖。