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组件的更多相关文章

  1. Qt大型工程开发技术选型Part3:Qt调用C#编写的COM组件实例

    Qt大型工程开发技术选型Part3:Qt调用C#编写的COM组件实例以及错误总结 ok,前面铺垫了那么多,现在来写一个开发实例,我会把其中隐藏的坑和陷阱简单谈谈,并在文章最后总结. 不愿意看长篇大论的 ...

  2. 【大型软件开发】浅谈大型Qt软件开发(二)面向未来开发——来自未来的技术:COM组件。我如何做到让我们的教学模块像插件一样即插即用,以及为什么这么做。

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  3. 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  4. K2 Blackpearl开发技术要点(Part2)

    转:http://www.cnblogs.com/dannyli/archive/2012/09/14/2685282.html K2 Blackpearl开发技术要点(Part2)  

  5. 【大型软件开发】浅谈大型Qt软件开发(一)开发前的准备——在着手开发之前,我们要做些什么?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要操刀这个 ...

  6. JAVA开源软件的技术选型--开源软件诞生2

    技术准备--第2篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址,点亮星标,支持一下,万分感谢 码云:https://gitee.com/redragon/redragon-erp github: ...

  7. 移动应用开发技术选型:WebApp>HybridApp>NativeApp

    一:概念辨析 Web App:生存在浏览器里的应用,只能运行在浏览器里,宿主是浏览器,不是操作系统.资源一般都在网络上,就是一个触屏版的网站.如:微信公众号.不需要在设备上下载安装,只需通过浏览器即可 ...

  8. Web开发技术选型之Java与PHP

    PHP与J2EE的对比 网上有很多关于PHP与J2EE之间的对比,细观无非以下几点: 1.语言特征 PHP为脚本语言,解释型语言,弱类型,专为Web开发打造.Java为C语言系编程语言,编译型,强类型 ...

  9. Android 开发技术选型(博客,新闻,阅读类)

    前言 最开始学习写应用的时候,发现类聚合数据这个平台可以提供一些免费数据接口,于是写了个人的第一个应用-– JuheNews,当时的知识储备稍显粗糙,虽然现在的知识也不咋滴,但是相对之前而言还是有些进 ...

  10. Leader 让我做 CMS 帮助中心的技术选型,我撸了 VuePress 和 GitBook,然后选择...

    前言 因为自己平时经常写博客,也有博客网站,所以 Leader 叫我做一个 CMS 的帮助中心的技术选型,CMS 的帮助中心的功能:是通过文章来教用户如何使用我们的项目. 所以笔者要做一个静态网站的技 ...

随机推荐

  1. [ABC310G] Takahashi And Pass-The-Ball Game

    Problem Statement There are $N$ Takahashi. The $i$-th Takahashi has an integer $A_i$ and $B_i$ balls ...

  2. 通过 VS Code 优雅地编辑 Pod 内的代码(非 NodePort)

    目录 1. 概述 2. NodePort 方式 3. Ingress 方式 4. 救命稻草 5. 其他 1. 概述 今天聊点啥呢,话说,你有没有想过怎样用 VS Code 连上 K8s 集群内的某个 ...

  3. 单元测试框架pytest

    1.什么是pytest pytest是一个非常成熟的全功能的Python测试框架,主要有以下特点: 简单灵活,容易上手,文档丰富 支持参数化,可以细粒度地控制要测试的测试用例 能够支持简单的单元测试和 ...

  4. Jenkins 系列:Jenkins 安装(Windows、Mac、Centos)和简介

    目录 简介 发展历史 应用场景 Jenkins 安装部署 先决条件 硬件要求 软件包下载 war 包部署 linux 系统部署 mac 系统部署 windows 系统部署 安装后基本配置 解锁 自定义 ...

  5. STM32CubeMX教程2 GPIO输出 - 点亮LED灯

    1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...

  6. 修改Ubuntu登录欢迎界面

    查看登录效果 run-parts /etc/update-motd.d ubuntu 与别的linux不同,直接修改/etc/motd文件重登录后无效.因为这里/etc/motd是一个符号链接,指向/ ...

  7. 2023年资深C#开发者的思考

    2023年转眼间就这样过掉了,作为一名资深C#的开发员人员,年龄也大了1岁,从最早接触C#开始,算下来已经超过15年以上了,随着工作经验的不断增加,物价不断的飞涨以及家庭支出的不断上涨,工作1份工资已 ...

  8. maven系列:依赖管理和依赖范围

    目录 一.依赖管理 使用坐标导入jar包 使用坐标导入 jar 包 – 快捷方式 使用坐标导入 jar 包 – 自动导入 二.依赖范围 三.可选依赖 四.排除依赖 一.依赖管理 使用坐标导入jar包 ...

  9. Java 设置PDF文档过期时间(有效期)

    有些文档具有一定时效性,需在规定时间段内才可阅读查看,针对此类文档,需要设置文档的过期日期.时间等.下面以Java示例演示为例如何给PDF文档设置过期时间.需使用PDF类库, Free Spire.P ...

  10. 智能对联模型太难完成?华为云ModelArts助你实现!手把手教学

    摘要:农历新年将至,听说华为云 AI 又将开启智能对对联迎接牛气冲天,让我们拭目以待!作为资深 Copy 攻城狮,想要自己实现一个对对联的模型,是不能可能完成的任务,因此我搜罗了不少前人的实践案例,今 ...