从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从托管到非托管的思路
从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从非托管到托管
写在前面
c#真的是一种非常蛋疼的语言,和别的语言兼容性差,界面开发效率也不是很高,但是胜在库功能强大,对windows的兼容好,编译快。但是托管的特性决定了它....就是会非常蛋疼。
这里说下托管与非托管。托管的意思就是指代码是放在.netframework上运行的。
换句话说,就是托管的代码理论上并不会编译成二进制文件,再让机器去读取你的机器指令,而是让你的代码去指挥.netframework去控制你的操作系统。c#的代码更多的看上去是在提供服务和接口,而不是真正意义上的代码,这也是托管的含义。
这就是c#蛋疼的地方。它很快,提供的接口也很多很方便,但是有两个致命问题。
1.它的粒度不够细。有时候提供了接口给你,那你只能去调用微软大爷的接口,但是实际上也许你并不需要这么多东西,只能使用微软提供的一些结构或者类,好的方面说,这可是微软程序员,虽然不说是世界上最懂程序员的人,但也算是最懂的一批了。坏的方面来说,他们Size和Count老是乱用,虽然你也知道正常有效的代码是不可能也没必要重写的,但是你就是会用着用着就不自觉地想有没有可能微软重新把这些基础的结构重写一遍。
2.它和非托管dll之间稀烂的兼容性。这也是这篇博客主要要写到,托管相当于是让代码跑在一个框架上,非托管则是让代码在机器上跑,这二者之间整整差了一层,其兼容性可想而知。当然你可能说我们有伟大的clr,当然如果你认同烂就是好这个观点,那么clr也是可以接受的了。
qt 与 c#的互操作
qt和c#的关系看我上一段文字也能明白了,不能说没啥关系,只能说毫不相干。那么我们的qt和c#有两个互操作方案,两种方案各有优劣,两种我都会写一下具体的操作方案
1.通过clr连接qt和c#
通过clr做中间层,连接qt和c#,这也是可以的,具体方案见下文
关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL
优点:编写简单,做法好理解
缺点:除了这两个优点全是缺点。1.这样做接口修改会很麻烦,一个地方修改就可能要涉及到多个连接的clr dll,项目小 包装还比较简单,但是如果多个dll之间交叉引用的话就可能导致一些意想不到的引用问题。
2.通过COM组件连接
当然我们有一个更好的方法,就是通过COM组件来实现。
首先我们要知道什么是COM组件:
COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。
说得简单一点,就是把一大堆的dll通过一套特定规范,把他们丢到整个系统环境里面去,然后我们需要的时候就可以通过指定的GUID、接口名称等去直接运行这个dll。
相当于是把dll们丢进了一个黑箱里面,我只需要知道我输入什么、会输出什么,就行,怎么实现的,或者内存分配等等我不用管,有点像.netframework的理念,但是兼容更简单,只需要编译出来的DLL满足他们的规范就可以注册了,Windows也提供了相关的接口。但是还是很傻逼的是.net的com组件只能用.net的方式注册,这个下面会写到。
ok,那么来说一下怎么进行COM组件的连接
1.这里我写了个demo来测试一下,为了模拟实际的环境,我们可以写两个c#的类,一个是直接被调用,需要做成com组件的c#类,姑且叫它ProcessNow类,一个是间接被调用,就是被ProcessNow引用的,无关的c# dll,姑且叫他Com_Test
Com_Test里面随便写什么都可以,只需要知道这个是被引用了的,为了模拟实际环境而存在的一个类,重要的是ProcessNow怎么写
详情可以见:https://blog.csdn.net/kingmax54212008/article/details/73604195
这里提一嘴注册,c# dll的com组件 注册并不像非托管的com组件注册那样简单,而是需要通过.net的工具去进行注册,也就是说.net托管的com组件也只能在有.netframework的情况下调用,否则
是会出问题的,也就是说不能通过regsvr32注册,而是需要通过.netframework进行,需要用到vs的那个工具,叫什么我忘了,具体需要看博客
从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从托管到非托管的思路的更多相关文章
- Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格
目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- python 全栈开发,Day100(restful 接口,DRF组件,DRF跨域(cors组件))
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确.方便快速开发 - 针对pc,手机,ipad,微信,支付宝... 使用同一个接口 2. 简述http协议? - 基 ...
- ASP.NET应用技巧:非托管COM组件的使用
众所周知,asp.net是基于通用语言运行库创建的,也就是所谓的托管执行环境.生成的代码称为托管代码.编译器能够从源代码的描述中产生元数据信息,而运行库又从元数据中获得托管代码的信息.而我们编写的组件 ...
- Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染
Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染 上一篇文章讲到了利用C++这个桥梁,我们实现了QML和Java的交互.Qt 5大力推崇的QML/JS开发,让轻量.高速开发的QML/J ...
- $attrs/inheritAttrs可以实现组件的跨级传递
$attrs/inheritAttrs可以实现组件的跨级传递 // 问题1 为什么this.$attrs可以得到主 传递过来的值 //$attrs 说明 // ...
- vs2019 Com组件初探-简单的COM编写以及实现跨语言调用
前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...
- react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)
第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...
- 关于Dll、Com组件、托管dll和非托管dll
转自:https://blog.csdn.net/black_bad1993/article/details/53906252 Com组件 1.线程模型是干嘛用的?解决"多个线程" ...
- PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解
本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...
随机推荐
- 延申三大问题中的第三个问题处理---发布更新时先把服务从注册中心给down下来,等待一段时间后再能更新模块
一开始采取的思路大致如下: 在preStop中使用/bin/sh命令,先down 然后sleep一段时间, 这种思路的执行情况如下: 假若升级容器使用的镜像版本的话,先执行preStop中的命令,sl ...
- RDS MySQL内存管理
官方文档地址:https://help.aliyun.com/product/26090.html?spm=5176.7920929.1290474.7.2c6f4f7bACaToi 官方文档地址:h ...
- Docker安装集群rabbitMQ
环境准备 Centos 7.5虚拟机三台: 192.168.102.128 192.168.102.130 192.168.102.131 以上虚拟机统一安装docker环境 三台机器分别配置如下所示 ...
- ERP是什么呢?
ERP(Enterprise Resource Planning,企业资源计划)系统,是进行物质资源.资金资源和信息资源集成一体化管理的企业信息管理系统,ERP统领企业全局,为管理层服务,重心在于企业 ...
- 华为网关交换机开启DHCP server服务
华为网关交换机可以配置基于全局地址池的DHCP服务器,也可以配置基于接口地址池的DHCP服务器,本人比较倾向于配置基于接口地址池的DHCP服务器,因此在这里只介绍后者. 第一步:开启DHCP功能 [S ...
- C++运算符重载(简单易懂)
转载:https://www.cnblogs.com/liuchenxu123/p/12538623.html 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型. 你 ...
- 分布式存储系统之Ceph集群RadosGW基础使用
前文我们了解了MDS扩展相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16759585.html:今天我们来聊一聊RadosGW的基础使用相关话题: ...
- SSM(Spring,SpringMVC,Mybatis)框架整合项目
快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...
- JVM、JDK、JRE你分的清吗
JVM.JDK.JRE你分的清吗 前言 在我们学习Java的时候,就经常听到"需要安装JDK"."运行需要JRE"."JVM调优"等等,这里 ...
- 更换SSD系统启动盘-PE重装系统
由于把C盘所在的磁盘替换为了另一张大容量SSD,因此必须借助于PE系统重装Win10,基本步骤如下: 由于每个人电脑不同,遇到的情况也不同,我的电脑是惠普暗影精灵,在PE系统中需要用分区助手把新磁盘进 ...