最近有一個項目,需要在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的組件容量大,如果程序哪裏有問題,大家可以留言或者拍磚。