Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件
Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件
之前有提到过我们项目部现在正在用Qt重构一个大型软件,现在的情景是这样的:
原先的软件是通过一个C++(CLR)的主程序,调用各种用C#开发的模块和程序,从而实现各种各样的功能。几乎所有的模块需要用到底层功能(比如语音、视频广播等等)都是通过与主框架底层交换消息码的形式发送的。
原来的框架有两个问题,一是因为年代太久了,现在整个软件的代码和内容实在是太过于冗余,模块之间的功能很多都有较差,废弃代码多,维护困难,占用内存过大,C#界面开发复杂,启动慢,用户反馈体验不好等问题。在经过半年的修修补补之后,我们决定重新开发主程序框架,再到后续的所有模块内容。
既然我们决定重新开发主程序,当然不可能是直接一次到位,直接把整个项目全部重写,这是不现实,也不可能的。所以开发方案是先只开发底层,然后这个底层主程序要完全兼容之前的模块,然后随着后续开发一点点把久的模块舍弃掉,直到全部都是新开发的模块。
我们在各种技术选型之后,决定选择使用纯C++做为底层的框架开发,Qt作为模块插槽。Qt开发主程序有几个好处,一是C++开发,考虑到我们的应用场景主要是学校(极大可能会遇到公立学校),可能会在未来遇到类似麒麟这类的国产linux系统(大趋势),加上兼容、跨平台等面向未来的需求,C++就成为了我们这个场景下的不二之选。当然了也可能会使用Qt进行开发,毕竟之前框架推倒的原因还是二十几年的积累导致代码过度冗余了。
进程间通信方案:Qt调用C#编写的COM组件
之前有提到Qt调Qt的COM组件,现在我们为了兼容之前的C#模块,必须要考虑的就是这个Qt调用C#编写的COM组件问题。目前的方案是通过几个中间件,让框架去调几乎所有的教学模块,并与之进行交互。
先来写一个COM组件:
C#编写COM组件,首先注意要确定我们DLL和应用程序的位数。调用方的位数要大于等于COM组件的位数。比如我们的Qt程序是64位的,那么COM组件就可以使32位或者64位的。但是反过来,如果COM组件是64位的,那调用方就只能是64位的。为了考虑到硬件兼容(我们的产品有可能会装到一些很垃圾的设备上,也包括arm设备),所有的程序都应该保证在32位的目标设备上进行开发。
所以我的下文中,COM组件要保证是通过32位编译,应用程序也是在32位下编译。
根据网上的教程,我们知道首先我们要有一个这样的C#类库,自己新建一个就可以了

然后点开Properties,找到AssmblyInfo.cs,将这行设为true

然后定义一个接口,我们的类要继承这个接口,因为貌似C#中的所有方法和事件都是通过接口来暴露和执行的?尽量保证自己的方法在接口中已经保有

然后继承这个接口,我们就可以开始写类了,内容如下(注意我加的标签):

ok,这样写完了之后就可以把项目编译,编译之后获得一个dll。叫CS_DLL_COM.dll,我们在工具栏中找到VS x86本机工具命令提示符

通过regasm CS_DLL_COM.dll的方式将该COM组件注册到系统中去
这个时候你应该注册成功了,想检查注册结果可以在regedit中,HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ICS_DLL_COM这个目录如果存在,那么就说明注册成功了

Qt在调用方同上一篇文章Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架里面有一个简单的COM组件调用实例,这里就不一一展开了。
总结:
1、有一个网上没有提到的点就是:要保证调用方的位数大于被调用方的,如果C#是编译的64位COM组件,而调用方的Qt程序是32位的,很有可能就会调用失败,这点需要注意。
2、还有就是注册的时候需要用VS x86(根据位数而定,如果是64位的就请用X64) 本机工具命令提示符 的regasm指令进行注册,regsvr32指令来注册C#的DLL是会出错的。
Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件的更多相关文章
- Qt大型工程开发技术选型Part3:Qt调用C#编写的COM组件实例
Qt大型工程开发技术选型Part3:Qt调用C#编写的COM组件实例以及错误总结 ok,前面铺垫了那么多,现在来写一个开发实例,我会把其中隐藏的坑和陷阱简单谈谈,并在文章最后总结. 不愿意看长篇大论的 ...
- 【大型软件开发】浅谈大型Qt软件开发(二)面向未来开发——来自未来的技术:COM组件。我如何做到让我们的教学模块像插件一样即插即用,以及为什么这么做。
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- K2 Blackpearl开发技术要点(Part2)
转:http://www.cnblogs.com/dannyli/archive/2012/09/14/2685282.html K2 Blackpearl开发技术要点(Part2)
- 【大型软件开发】浅谈大型Qt软件开发(一)开发前的准备——在着手开发之前,我们要做些什么?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要操刀这个 ...
- JAVA开源软件的技术选型--开源软件诞生2
技术准备--第2篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址,点亮星标,支持一下,万分感谢 码云:https://gitee.com/redragon/redragon-erp github: ...
- 移动应用开发技术选型:WebApp>HybridApp>NativeApp
一:概念辨析 Web App:生存在浏览器里的应用,只能运行在浏览器里,宿主是浏览器,不是操作系统.资源一般都在网络上,就是一个触屏版的网站.如:微信公众号.不需要在设备上下载安装,只需通过浏览器即可 ...
- Web开发技术选型之Java与PHP
PHP与J2EE的对比 网上有很多关于PHP与J2EE之间的对比,细观无非以下几点: 1.语言特征 PHP为脚本语言,解释型语言,弱类型,专为Web开发打造.Java为C语言系编程语言,编译型,强类型 ...
- Android 开发技术选型(博客,新闻,阅读类)
前言 最开始学习写应用的时候,发现类聚合数据这个平台可以提供一些免费数据接口,于是写了个人的第一个应用-– JuheNews,当时的知识储备稍显粗糙,虽然现在的知识也不咋滴,但是相对之前而言还是有些进 ...
- Leader 让我做 CMS 帮助中心的技术选型,我撸了 VuePress 和 GitBook,然后选择...
前言 因为自己平时经常写博客,也有博客网站,所以 Leader 叫我做一个 CMS 的帮助中心的技术选型,CMS 的帮助中心的功能:是通过文章来教用户如何使用我们的项目. 所以笔者要做一个静态网站的技 ...
随机推荐
- lca 学习笔记
定义 最近公共祖先简称 \(LCA\) 两个节点的最近公共祖先,就是这两个点的公共祖先里,离根最远的的那个 为了方便,我们记某点集 \(S={v1,v2,...,vn}\) 的最近公共祖先为 \(LC ...
- cache操作:clean、invalidate与flush的含义
前言 本文试图搞清楚cache几个操作:clean.invalidate与flush的含义.由于只用过ARM和RISC-V,所以是从ARM和RISC-V的角度来说明. cache line cache ...
- CSS语法检查利器之csslint
本文于2015年底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 背景 前段时间研究使用YUI Compressor压缩项目里的js和cs ...
- DC-3
DC-3 前言:这个DC系列去年就做完了,但是因为那时候visualbox老崩搞得头大,一直漏了DC-3没做.现在重新搞好了来完结这个系列 扫存活的主机,显示只开了80 扫了一下目录,看了几个没有什么 ...
- mysql数据监控(db.odbc.select[])
监控项 : db.odbc.select[<unique short description>,<dsn>] #返回SQL查询结果的第一行的第一列中 Type 类型,选择监控 ...
- Linux的一些的常用命令
小杰笔记: 记录一下Linux的一些常见命令: 1:Linux关机与重启的命令: shutdown:关机 shutdown -h 30 30秒后关机 reboot 重启 sync:将数据由内存同步到硬 ...
- 解决 cv2.destroyAllWindows() 无效问题
方法一 示例代码: import cv2 import numpy as npimg = np.zeros((512,512),np.uint8)#生成一个空灰度图像 cv2.line(img,(0, ...
- Mybatis 源码6 结果集映射流程 ,mybatis插件实现原理和基于mybatis插件实现参数化类型TypeHandler
一丶前情回顾 书接上回,下面是SimpleExecutor执行查询的主要逻辑 prepareStatement 实现获取数据库连接, 其中连接是从Transaction.getConnection方法 ...
- 云原生2.0时代,华为云DevOps立体运维实践
摘要:随着云原生2.0时代的来临,越来越多的企业及个人选择使用云原生技术来构建业务,云原生技术给业务构建.交付带了便利的同时,对运维也提出了更高的要求. 2020年12月,中国DevOps社区峰会在北 ...
- 整理混乱的头文件,我用include what you use
摘要:使用include-what-you-use(iwyu/IWYU)清理冗余头文件,补充必要头文件. 本文分享自华为云社区<用include what you use拯救混乱的头文件> ...