一、介绍

        这个东西我以前没有接触过,但是公司项目里面有用到这个东西,所以就顺便研究一下。今天只是做了 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 --version69.0.0 6 7 Paket CLI: 8 9
>paket add CefSharp.WinForms --version69.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')" /> <
ImportProject
="..\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进程。


    三、总结

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

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信