C# 使用CefSharp嵌入網站

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章