• C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用


    BIMFACE二次开发系列目录     【已更新最新开发文章,点击查看详细】

      在我的博客《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://github.com/cefsharp/CefSharp

      

    • 完善的文档 

            

      

    • 支持JS、C#、WinForm窗体之间相互通讯与调用
    • 兼容性较好,支持H5、CSS5、WebGL等
    • 支持获取Cookies较全面
    • 其他
    二、CefSharp 下载

    步骤1 新建WinForm项目

    新建一个WinForm窗体应用程序,目标框架选择 .NET Framework 4.5.2,因为新版本的CefSahrp组件最低支持 .NET Framework 4.5.2。

    步骤2 通过 NeGet 下载

    打开NeGet

    (1)搜索 CefSharp

    (2)选择 CefSharp.WinForms

    (3)选择最新版本

    (4)点击【安装】按钮

    点击【确定】开始安装。

    安装完成后,项目中自动添加了CefSharp.dll、CefSharp.Core.dll、CefSharp.WinForms.dll 类库引用。

    工具箱中也增加了CefSharp控件

    步骤3 编译项目

    编译 BIMFace.SDK.CSharp.Sample.WinForm 项目,生成如下内容

    与 CefSharp 相关的共计32个文件,2个目录,文件大小总计216M。这个尺寸相对于业务系统本身来说已经非常大了,最后制作的安装包尺寸也会很大。

    其中 locales 目录下是语言包,删除 zh-CN.pak 之外的所有文件,总文件大小可以减少22M左右。

    三、CefSharp 集成开发

    测试功能设计如下

    功能说明

    (1)WinForm中加载的网页来自于 BIMFace.SDKBIMFace.SDK.CSharp.SamplePagesBIMFaceDemo7_3.html,所以Web项目要首先运行。

    (2)WinForm 窗体中输入 BIMFACE FileId,点击【加载模型/图纸】按钮,调用CefSahrp组件,加载步骤(1)中的网页。代码如下:

     1 // 加载模型/图纸
     2 private void btnLaodBIMFaceFile_Click(object sender, EventArgs e)
     3 {
     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);
    13 
    14     string url = "https://localhost:44389/Pages/BIMFaceDemo7_3.html?fileId=" + fileId;
    15     chromiumWebBrowser1.Load(url);
    16 }

    (3)网页中点击【JS 调用 C# 方法】按钮。代码如下:

    在入口函数中,获取注入的 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组件加载网页之前,将其注入到网页中

    (4)WinForm窗体中点击【 C# 调用 JS 方法】按钮。代码如下:

     1 // C# 调用 JS 方法
     2 private void btnCsharpCallJsMethod_Click(object sender, EventArgs e)
     3 {
     4     Task<JavascriptResponse> jsResponse = chromiumWebBrowser1.EvaluateScriptAsync("jsMethodForCSharpTestCalcSub", 25, 7);
     5 
     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格式的字符串,然后反序列化为对象即可使用*/
    4 
    5     alert('传入的参数num1:' + num1 + ", num2:" + num2 + '  减法运算 num1 - num2 = ' + (num1 - num2));
    6 }

    特别说明:

    (1)C#定义的方法供JS调用,C#方法的返回值类型、参数类型都只能是简单数据类型,如:int、string、bool 等。

    (2)JS定义的方法供C#调用,JS方法的返回值类型、参数类型都只能是简单数据类型,如:int、string、bool 等。

    一般来说复杂类型就是一个实体类。如果确实想使用复杂类型,建议的解决方案如下:

    将复杂类型序列化为字符串,调用方将其反序列化之后再使用。

    关于C#与JS互相通讯,请参考CefSahrp官方文档:https://github.com/cefsharp/CefSharp/wiki/General-Usage#3-how-do-you-expose-a-net-class-to-javascript

    四、CefSharp 组件运行分析

    1、进程分析

    (1)启动应用程序,CefSharp组件未加载Web网页时,默认启动了2个 CefSharp.BrowserSubProcess 子进程。原因是我当前使用的CefSharp是94.4.50版本,每当new CefSharp.WinForms.ChromiumWebBrowser() 一个时,会启动2个子进程。

    (2)CefSharp组件加载Web网页后,又启动了2个 CefSharp.BrowserSubProcess 子进程,共计4个子进程。原因是 当 chromiumWebBrowser1.Load(url) 时启动2个子进程。不同版本的 CefSharp 组件,启动的子进程数量不同。

    2、运行日志分析

    CefSahrp组件加载网页浏览BIMFace模型/图纸之后,程序目录多了 GPUCache 目录、debug.txt 文件。

    GPUCache目录内容如下。BIMFACE加载模型/图纸时利用了本地电脑的GPU强大的计算功能,所以产生了缓存内容。

    debug.txt 内如如下,里面记录了网页的执行过程

    五、总结
    • 通过NeGet安装SDK时,运行时环境会被自动下载到当前项目的bindebug 或者 binRelease目录下。导致整个项目非常大,大约220M左右。
    • 以独立进程方式运行,消耗内存较多。

      如下是我的一个WinForm程序中使用CefSharp组件的运行状态,其中一个子进程消耗内存达到1.5G,太可怕了

      

    • 当控件Dock属性设置为 Fill,客户端电脑的缩放与布局不是100%时,窗体呈现黑边(严重bug),并没有完全填充父容器。

      

    《BIMFace.SDK.CSharp》开源SDK。欢迎大家下载使用。

    BIMFACE二次开发系列目录     【已更新最新开发文章,点击查看详细】

    成在管理,败在经验;嬴在选择,输在不学!  贵在坚持!

    欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。

       

     个人作品

       

        1、BIMFace.Community.SDK.NET

         开源地址:https://gitee.com/NAlps/BIMFace.SDK

         系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html

         系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html

       

        2、ZCN.NET.Common

         开源地址:https://gitee.com/NAlps/zcn.net.common

     技术栈

       

     1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

     2、jQuery、Vue.js、Bootstrap

     3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、达梦DM、人大金仓、 神通、南大通用 GBase、华为 GaussDB 、腾讯 TDSQL 、阿里 PolarDB、蚂蚁金服 OceanBase、东软 OpenBASE、浪潮云溪数据库 ZNBase

     4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表、读写分离

     5、架构:领域驱动设计 DDD、ABP

     6、环境:跨平台、Windows、Linux(CentOS、麒麟、统信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

     7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

       

     云原生、微服务、Docker、CI/CD、DevOps、K8S;

     Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件、RPC、ELK;

     .NET + Docker + jenkins + Github + Harbor + K8S;

    出处:www.cnblogs.com/SavionZhang

    作者:张传宁   微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。

              专注于微软.NET技术(.NET Core、Web、MVC、WinForm、WPF)、通用权限管理系统、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。

              多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。

              熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。

             


             

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。

    如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!

  • 相关阅读:
    Java 创建过滤器 解析xml文件
    web页面隐藏鼠标
    dom4j微信接口开发
    php实现远程网络文件下载到服务器指定目录 阿星小栈
    laravel 框架给$request添加数据 阿星小栈
    Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license” and then retry this command. 阿星小栈
    在vue项目中使用echarts 阿星小栈
    js 数组、时间、邮箱等处理方法 阿星小栈
    iview 在Table组件render 中使用Poptip组件 阿星小栈
    逐步解决动态添加样式导致的元素闪烁 阿星小栈
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/15424560.html
Copyright © 2020-2023  润新知