zoukankan      html  css  js  c++  java
  • C#使用CefSharp开源库开发Chrome 浏览器

       
        一、介绍

            这个东西我以前没有接触过,但是公司项目里面有用到这个东西,所以就顺便研究一下。今天只是做了 WinForm 的测试,有时间了在试试 WPF 是如何实现的。刚开始一塌糊涂,有点麻烦,慢慢的理清了,其实也不是很难。

        二、开发步骤

            1、下载和安装程序集

                当前程序集最新的版本是69.0.0,如果想直接下载程序集的 DLL ,可以通过该地址进行下载 https://www.nuget.org/packages/CefSharp.WinForms/69.0.0。说明一下,以后的版本有可能会变,具体的地址也有可能会变。可以通过nuget轻松获得所有的依赖库。如果的你的网络不好,可以先下载,然后再在项目中添加引用。 效果如图:

                   

                如果是使用 Windows 操作系统,开发 WinForm 应用,我们可以使用 NuGet 程序包进行安装:

    1             PM> Install-Package CefSharp.WinForms -Version 69.0.0
    2 
    3             NET CLI:
    4 
    5             >dotnet add package CefSharp.WinForms --version 69.0.0
    6                 
    7             Paket CLI:
    8 
    9             >paket add CefSharp.WinForms --version 69.0.0 


            2、代码实现

                1)主窗体实现


                    主窗体如图:
                        
                   

                    主窗体代码:

     1                 using CefSharp.WinForms;
     2                 using System.Windows.Forms;
     3 
     4                 namespace ChromiumWebBrowserForWindowsForms
     5                 {
     6                     public partial class frmBrower : Form
     7                     {
     8                         private ChromiumWebBrowser webBrowser;
     9 
    10                         public frmBrower()
    11                         {
    12                             InitializeComponent();
    13                             this.Load += Form1_Load;
    14                         }
    15 
    16                         private void Form1_Load(object sender, System.EventArgs e)
    17                         {
    18                             webBrowser = new ChromiumWebBrowser("www.cnblog.com");
    19                             webBrowser.Dock = DockStyle.Fill;
    20                             this.pnlContainer.Controls.Add(webBrowser);
    21                             webBrowser.Load("www.cnblogs.com");
    22                         }
    23 
    24                         private void btnEnter_Click(object sender, System.EventArgs e)
    25                         {
    26                             ChildForm child = new ChildForm(txtUrl.Text);
    27                             child.Show();
    28                         }
    29                     }
    30                 }


                2)子窗体实现:

                    子窗体如图:

                  

                    代码实现:

     1                 using CefSharp.WinForms;
     2                 using System;
     3                 using System.Windows.Forms;
     4 
     5                 namespace ChromiumWebBrowserForWindowsForms
     6                 {
     7                     public partial class ChildForm : Form
     8                     {
     9                         private ChromiumWebBrowser webBrowser;
    10                         private string url;
    11                         public ChildForm()
    12                         {
    13                             InitializeComponent();
    14                             this.Load += ChildForm_Load;
    15                         }
    16 
    17                         public ChildForm(string text):this()
    18                         {
    19                             url = text;
    20                         }
    21 
    22                         private void ChildForm_Load(object sender, EventArgs e)
    23                         {
    24                             webBrowser = new ChromiumWebBrowser(null);
    25                             webBrowser.Dock = DockStyle.Fill;
    26                             this.Controls.Add(webBrowser);
    27                             webBrowser.Load(url);
    28                         }
    29                     }
    30                 } 


            3、解决问题

                1)、增加 AnyCPU 支持(CefSharp.Common does not work correctly on 'AnyCPU' platform. You need to specify platform (x86 / x64)。 这个错误其实是cefsharp的一个缺陷。cefsharpPic的项目团队说以后会把这个bug修补。我们暂时现在把这个问题解决。 )

                    [1]、您必须将<CefSharpAnyCpuSupport> true </ CefSharpAnyCpuSupport>添加到项目中的第一个<PropertyGroup>配置节(例如.csproj文件)

                        <?xml version="1.0" encoding="utf-8"?>
                        <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
                          <Import Project="..packagesCefSharp.WinForms.69.0.0uildCefSharp.WinForms.props" Condition="Exists('..packagesCefSharp.WinForms.69.0.0uildCefSharp.WinForms.props')" />
                          <Import Project="..packagesCefSharp.Common.69.0.0uildCefSharp.Common.props" Condition="Exists('..packagesCefSharp.Common.69.0.0uildCefSharp.Common.props')" />
                          <Import Project="..packagescef.redist.x86.3.3497.1841uildcef.redist.x86.props" Condition="Exists('..packagescef.redist.x86.3.3497.1841uildcef.redist.x86.props')" />
                          <Import Project="..packagescef.redist.x64.3.3497.1841uildcef.redist.x64.props" Condition="Exists('..packagescef.redist.x64.3.3497.1841uildcef.redist.x64.props')" />
                          <Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props')" />
                          <PropertyGroup>
                            <CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>



                    [2]、增加 <probing privatePath="x86"/> 去你的 app.config 配置文件。

                        <runtime>
                            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                                <probing privatePath="x86"/>
                            </assemblyBinding>
                        </runtime>


                    [3]、修改应用程序根目录下的 Program.cs 文件。

     1                     [STAThread]
     2                     public static void Main()
     3                     {
     4                         var settings = new CefSettings();
     5                         settings.BrowserSubprocessPath = @"x86CefSharp.BrowserSubprocess.exe";
     6 
     7                         Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
     8 
     9                         var browser = new BrowserForm();
    10                         Application.Run(browser);
    11                     }


                2)、没有在程序启动的时候初始化 CefSharp 导致添加ChromiumWebBrowser控件显示一片灰色。


                    [1]、要初始化 CefSharp 对象,否则就是什么都没有。

     1                     [STAThread]
     2                     public static void Main()
     3                     {
     4                         var settings = new CefSettings();
     5                         settings.BrowserSubprocessPath = @"x86CefSharp.BrowserSubprocess.exe";
     6 
     7                         Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
     8 
     9                         var browser = new BrowserForm();
    10                         Application.Run(browser);
    11                     }


              3)、bin目录下没有包含CefSharp.BrowserSubprocess.Core.dll、CefSharp.BrowserSubprocess.exe。关于这两个资源文件的作用,有兴趣可以了解浏览器的多进程架构机制原理。打开多个ChromiumWebBrowser控件显示网页就加载多个CefSharp.BrowserSubprocess.exe进程。


        三、总结

            这算是一个一个小的进步吧,以前没有遇过的东西,现在懂了就是进步。如有需要在深入了解。不忘初心,继续努力。

  • 相关阅读:
    【iCore、iCore2 双核心板】EPCS 实验(SPI Flash)(基于Verilog语言)
    【iCore2双核心板】SRAM 读写实验(基于Verilog语言)
    大便难案
    乌梅丸案二则
    奔豚
    中医对甲流的认识
    大青龙汤临床应用
    中风之补阳还五汤
    时方的魅力
    艾灸急治
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/10281941.html
Copyright © 2011-2022 走看看