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. 用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识

    写这个博客的目的就是我在网上看了半天,发现没有这方面的知识,也许是老手认为这个太简单了,不过我还是告诉新人使用dbeaver来创建一个enum类型的方法: 就是enum("a",& ...

  2. SpringBoot整合EasyExcel

    1.Excel导入导出的应用场景 在做项目中很多时候都会用到Excel的导入和导出 2.解决方案 POI:操作比较繁琐 EasyExcel:正如其名,'Easy'Excel相对于POI使用起来还是比较 ...

  3. 微调baichuan2-7b遇到的显存坑

    问题描述: 微调baichuan2-7b模型,验证一轮后继续训练第一个iteration显存大幅增加 项目链接: https://github.com/wp931120/baichuan_sft_lo ...

  4. 启动android项目时报dx.jar错误的解决方案

    启动android项目时遇到如下错误: Failed to load E:\SDK\android-sdk-windows\build-tools\27.0.2\lib\dx.jar 原因: 自动使用 ...

  5. 【OpenVINO】 使用 OpenVINO CSharp API 部署 PaddleOCR 项目介绍

    前言:   在之前的项目中,我们已经使用 OpenVINOTM CSharp API 部署 PaddleOCR 全系列模型,但随着PaddleOCRv4版本发布以及OpenVINO CSharp AP ...

  6. P1990-覆盖墙壁

    分情况: \[\left\{ \begin{aligned} & 条形 \left\{ \begin{aligned} 横着\\ 竖着\\ \end{aligned}\right. \\ &a ...

  7. Unreal学习笔记1-打印输出

    1. 概述 相比各种打断点调试的办法,还是更习惯使用打印输出来进行调试. 2. 详论 2.1. 代码 这里写了三个函数:分别是输出到屏幕,输出到警告日志,输出错误日志. Output.h: #prag ...

  8. 浏览器工作原理和实践(二)——JavaScript

    <浏览器工作原理与实践>是极客时间上的一个浏览器学习系列,在学习之后特在此做记录和总结. 一.执行流程 实际上变量和函数声明在代码里的位置是不会改变的,而且是在编译阶段被 JavaScri ...

  9. 带你了解VXLAN网络中报文的转发机制

    摘要:本节以集中式VXLAN网络(手工方式建立VXLAN隧道)为例,分别介绍相同子网内.不同子网间是如何进行通信的.在了解转发机制的前提下,我们先来看下VXLAN网关有哪些种类. VXLAN二层网关与 ...

  10. 基于KubeEdge的边缘节点分组管理设计与实现

    摘要:KubeEdge 1.11版本提供了"边缘节点分组管理"新特性,抽象出了跨地域的应用部署模型. 本文分享自华为云社区<基于KubeEdge的边缘节点分组管理设计与实现& ...