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="..\packages\CefSharp.WinForms.69.0.0\build\CefSharp.WinForms.props" Condition="Exists('..\packages\CefSharp.WinForms.69.0.0\build\CefSharp.WinForms.props')" />
                      <Import Project="..\packages\CefSharp.Common.69.0.0\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.69.0.0\build\CefSharp.Common.props')" />
                      <Import Project="..\packages\cef.redist.x86.3.3497.1841\build\cef.redist.x86.props" Condition="Exists('..\packages\cef.redist.x86.3.3497.1841\build\cef.redist.x86.props')" />
                      <Import Project="..\packages\cef.redist.x64.3.3497.1841\build\cef.redist.x64.props" Condition="Exists('..\packages\cef.redist.x64.3.3497.1841\build\cef.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 = @"x86\CefSharp.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 = @"x86\CefSharp.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進程。


    三、總結

        這算是一個一個小的進步吧,以前沒有遇過的東西,現在懂了就是進步。如有需要在深入了解。不忘初心,繼續努力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM