1、介紹
這個東西我之前沒有接觸過,可是公司項目裏面有用到這個東西,因此就順便研究一下。今天只是作了 WinForm 的測試,有時間了在試試 WPF 是如何實現的。剛開始一塌糊塗,有點麻煩,慢慢的理清了,其實也不是很難。
2、開發步驟
一、下載和安裝程序集
當前程序集最新的版本是69.0.0,若是想直接下載程序集的 DLL ,能夠經過該地址進行下載 https://www.nuget.org/packages/CefSharp.WinForms/69.0.0。說明一下,之後的版本有可能會變,具體的地址也有可能會變。能夠經過nuget輕鬆得到全部的依賴庫。若是的你的網絡很差,能夠先下載,而後再在項目中添加引用。 效果如圖:
若是是使用 Windows 操做系統,開發 WinForm 應用,咱們能夠使用 NuGet 程序包進行安裝:
web
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
二、代碼實現
1)主窗體實現:
主窗體如圖:
主窗體代碼:
redis
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 }
三、解決問題
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 文件。
app
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進程。
3、總結
這算是一個一個小的進步吧,之前沒有遇過的東西,如今懂了就是進步。若有須要在深刻了解。不忘初心,繼續努力。ui