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的组件容量大,如果程序哪里有问题,大家可以留言或者拍砖。

 

posted @ 2019-07-31 11:39  没事儿写个bug  阅读(3470)  评论(0编辑  收藏  举报