C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用
![作者头像](https://ask.qcloudimg.com/http-save/yehe-6210438/6gt6s5h9dq.jpeg)
![](https://ask.qcloudimg.com/http-save/yehe-6210438/aa137532bda004380ae4ed15ae60cde7.jpeg)
在我的博客 《C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案》 中介绍了多种集成BIMFACE到客户端程序中的方案。最后推荐大家使用 CefSharp组件与WebView2组件。本篇文章介绍使用CefSharp组件如何集成BIMFACE到客户端程序中。
一、CefSharp 简介
CefSharp是一个围绕Chromium Embedded Framework(CEF)的轻量级.NET包装器。它是用C++/CLI编写的。允许开发者在.NET应用程序中嵌入Chromium。可以在C#或VB或任何其他CLR语言中使用。CefSharp同时提供WPF和WinForms Web浏览器控件实现。
功能特点
![](https://ask.qcloudimg.com/http-save/yehe-6210438/069d53e4bd09767f2643bc4df9746261.png)
- 完善的文档
![](https://ask.qcloudimg.com/http-save/yehe-6210438/4636681976605ffce44f1bcc2cd5c8da.png)
![](https://ask.qcloudimg.com/http-save/yehe-6210438/ed8f937893763c1dfa6a9aaafb44bdc6.png)
- 支持JS、C#、WinForm窗体之间相互通讯与调用
- 兼容性较好,支持H5、CSS5、WebGL等
- 支持获取Cookies较全面
- 其他
二、CefSharp 下载
步骤1 新建WinForm项目
新建一个WinForm窗体应用程序,目标框架选择 .NET Framework 4.5.2,因为新版本的CefSahrp组件最低支持 .NET Framework 4.5.2。
![](https://ask.qcloudimg.com/http-save/yehe-6210438/ea84da484f22420bedf568292fc8cbaf.png)
步骤2 通过 NeGet 下载
打开NeGet
(1)搜索 CefSharp
(2)选择 CefSharp.WinForms
(3)选择最新版本
(4)点击【安装】按钮
![](https://ask.qcloudimg.com/http-save/yehe-6210438/671925c8ac4c76a7c4cba7573b288284.png)
![](https://ask.qcloudimg.com/http-save/yehe-6210438/d736057f29037b01fbb9eb09a123d1c2.png)
点击【确定】开始安装。
安装完成后,项目中自动添加了CefSharp.dll、CefSharp.Core.dll、CefSharp.WinForms.dll 类库引用。
![](https://ask.qcloudimg.com/http-save/yehe-6210438/3244959403bba5aeadd3cdeacd26bf13.png)
工具箱中也增加了CefSharp控件
![](https://ask.qcloudimg.com/http-save/yehe-6210438/07f47c2eb9e92337eb0b35b066325cc6.png)
步骤3 编译项目
编译 BIMFace.SDK.CSharp.Sample.WinForm 项目,生成如下内容
![](https://ask.qcloudimg.com/http-save/yehe-6210438/ed67f0a150097d9f6946b36ea10a0a85.png)
与 CefSharp 相关的共计32个文件,2个目录,文件大小总计216M。这个尺寸相对于业务系统本身来说已经非常大了,最后制作的安装包尺寸也会很大。
其中 locales 目录下是语言包,删除 zh-CN.pak 之外的所有文件,总文件大小可以减少22M左右。
三、CefSharp 集成开发
测试功能设计如下
![](https://ask.qcloudimg.com/http-save/yehe-6210438/087dae285761aa32e9d29495d9ba7202.gif)
功能说明
(1)WinForm中加载的网页来自于 BIMFace.SDK\BIMFace.SDK.CSharp.Sample\Pages\BIMFaceDemo7_3.html,所以Web项目要首先运行。
(2)WinForm 窗体中输入 BIMFACE FileId,点击【加载模型/图纸】按钮,调用CefSahrp组件,加载步骤(1)中的网页。代码如下:
1 // 加载模型/图纸
2 private void btnLaodBIMFaceFile_Click(object sender, EventArgs e)
4 string fileId = txtBIMFaceFileId.Text.Trim();
5 if (string.IsNullOrEmpty(fileId))
6 {
7 MessageBox.Show("请填写 BIMFACE FileId。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
8 return;
9 }
10 // 将 ChromiumWebBrowserBindObject 实例对象注入到 js 对象中。网页中即可调用 ChromiumWebBrowserBindObject 类中定义的属性、方法
11 var objToBind = new ChromiumWebBrowserBindObject();
12 chromiumWebBrowser1.JavascriptObjectRepository.Register("_chromeBrowser", objToBind, true, BindingOptions.DefaultBinder);
14 string url = "https://localhost:44389/Pages/BIMFaceDemo7_3.html?fileId=" + fileId;
15 chromiumWebBrowser1.Load(url);
16 }
(3)网页中点击【JS 调用 C# 方法】按钮。代码如下:
![](https://ask.qcloudimg.com/http-save/yehe-6210438/87e0b8c621f96cda083ddff3f4cd85aa.png)
在入口函数中,获取注入的 ChromiumWebBrowser 对象,名称为 _chromeBrowser。
按钮对应的js方法
1 // js 调用 C# 方法
2 function callCharpMethod() {
3 // 特别提醒:C# 类中定义的方法名称采用 Pascal 命名。网页中调用的时候必须将方法名称的第一个字母改为小写。否则调用不成功。
4 _chromeBrowser.testCalcAdd(6,8)
5 .then(function (response) {
6 alert(response);
7 });
8 }
特别提醒:C# 类中定义的方法名称采用 Pascal 命名。网页中调用的时候必须将方法名称的第一个字母改为小写。否则调用不成功。
调用的C#方法。定义一个单独的类,用于在CefSahrp组件加载网页之前,将其注入到网页中
![](https://ask.qcloudimg.com/http-save/yehe-6210438/37072e06d9d45ce36b15777b3be275a4.png)
(4)WinForm窗体中点击【 C# 调用 JS 方法】按钮。代码如下:
1 // C# 调用 JS 方法
2 private void btnCsharpCallJsMethod_Click(object sender, EventArgs e)
4 Task<JavascriptResponse> jsResponse = chromiumWebBrowser1.EvaluateScriptAsync("jsMethodForCSharpTestCalcSub", 25, 7);
6 if (jsResponse.Result != null && jsResponse.Result.Success == false)
7 {
8 MessageBox.Show("C#调用JS方法发生异常。" + jsResponse.Result.Message
9 , "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
10 }
11 }
网页中定义的 jsMethodForCSharpTestCalcSub() 方法如下:
1 // js 方法,供C#调用
2 function jsMethodForCSharpTestCalcSub(num1, num2) {
3 /*如果参数需要是复杂类型,则传递Json格式的字符串,然后反序列化为对象即可使用*/
5 alert('传入的参数num1:' + num1 + ", num2:" + num2 + ' 减法运算 num1 - num2 = ' + (num1 - num2));