一, 介绍
这个东西我以前没有接触过, 但是公司项目里面有用到这个东西, 所以就顺便研究一下. 今天只是做了 WinForm 的测试, 有时间了在试试 WPF 是如何实现的. 刚开始一塌糊涂, 有点麻烦, 慢慢的理清了, 其实也不是很难.
二, 开发步骤
1, 下载和安装程序集
当前程序集最新的版本是 69.0.0, 如果想直接下载程序集的 DLL , 可以通过该地址进行下载 https://www.nuget.org/packages/CefSharp.WinForms/69.0.0. 说明一下, 以后的版本有可能会变, 具体的地址也有可能会变. 可以通过 nuget 轻松获得所有的依赖库. 如果的你的网络不好, 可以先下载, 然后再在项目中添加引用. 效果如图:
如果是使用 Windows 操作系统, 开发 WinForm 应用, 我们可以使用 NuGet 程序包进行安装:
- PM> Install-Package CefSharp.WinForms -Version 69.0.0
- NET CLI:
- >dotnet add package CefSharp.WinForms --version 69.0.0
- Paket CLI:
- >paket add CefSharp.WinForms --version 69.0.0
2, 代码实现
1) 主窗体实现:
主窗体如图:
主窗体代码:
- using CefSharp.WinForms;
- using System.Windows.Forms;
- namespace ChromiumwebBrowserForWindowsForms
- {
- public partial class frmBrower : Form
- {
- private ChromiumWebBrowser webBrowser;
- public frmBrower()
- {
- InitializeComponent();
- this.Load += Form1_Load;
- }
- private void Form1_Load(object sender, System.EventArgs e)
- {
- webBrowser = new ChromiumWebBrowser("www.cnblog.com");
- webBrowser.Dock = DockStyle.Fill;
- this.pnlContainer.Controls.Add(webBrowser);
- webBrowser.Load("www.cnblogs.com");
- }
- private void btnEnter_Click(object sender, System.EventArgs e)
- {
- ChildForm child = new ChildForm(txtUrl.Text);
- child.Show();
- }
- }
- }
2) 子窗体实现:
子窗体如图:
代码实现:
- using CefSharp.WinForms;
- using System;
- using System.Windows.Forms;
- namespace ChromiumWebBrowserForWindowsForms
- {
- public partial class ChildForm : Form
- {
- private ChromiumWebBrowser webBrowser;
- private string url;
- public ChildForm()
- {
- InitializeComponent();
- this.Load += ChildForm_Load;
- }
- public ChildForm(string text):this()
- {
- url = text;
- }
- private void ChildForm_Load(object sender, EventArgs e)
- {
- webBrowser = new ChromiumWebBrowser(null);
- webBrowser.Dock = DockStyle.Fill;
- this.Controls.Add(webBrowser);
- webBrowser.Load(url);
- }
- }
- }
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 文件.
- [STAThread]
- public static void Main()
- {
- var settings = new CefSettings();
- settings.BrowserSubprocessPath = @"x86\CefSharp.BrowserSubprocess.exe";
- Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
- var browser = new BrowserForm();
- Application.Run(browser);
- }
2), 没有在程序启动的时候初始化 CefSharp 导致添加 ChromiumWebBrowser 控件显示一片灰色.
[1], 要初始化 CefSharp 对象, 否则就是什么都没有.
- [STAThread]
- public static void Main()
- {
- var settings = new CefSettings();
- settings.BrowserSubprocessPath = @"x86\CefSharp.BrowserSubprocess.exe";
- Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
- var browser = new BrowserForm();
- Application.Run(browser);
- }
3),bin 目录下没有包含 CefSharp.BrowserSubprocess.Core.dll,CefSharp.BrowserSubprocess.exe. 关于这两个资源文件的作用, 有兴趣可以了解浏览器的多进程架构机制原理. 打开多个 ChromiumWebBrowser 控件显示网页就加载多个 CefSharp.BrowserSubprocess.exe 进程.
三, 总结
这算是一个一个小的进步吧, 以前没有遇过的东西, 现在懂了就是进步. 如有需要在深入了解. 不忘初心, 继续努力.
来源: https://www.cnblogs.com/PatrickLiu/p/10281941.html