从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学习 ...
随机推荐
- linux安装Texinfo
安装步骤 tar zxvf texinfo-5.2.tar.gz cd texinfo-5.2 ./configure --prefix=/usr make make check make insta ...
- 修改端口号还是无法启动第二个tomcat的原因
问题:我的服务器是Tomcat7.0.20,修改完所有端口之后(shutdown端口.http端口.https端口.ajp端口),启动一个就不能启动另一个. 两 个startup.bat最前面加上一句 ...
- Kafka之安装
Kafka之安装 一.下载kafka 此博客只讲述kafka0.8和kafka1.0两个版本 更改kafka下的/home/bigdata/kafka/config/server.properties ...
- SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
近年来uni-app发展势头迅猛,只要会vue.js,就可以开发一套代码,发布移动应用到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/ ...
- Docker之介绍与安装
Docker 说明 本章,我们主要从Docker简介.Docker中几个核心概念和Docker安装这几个方面对Docker进行介绍! 1. Docker 简介 1.1. 什么是 Docker Dock ...
- 27.-Django发送邮件
一.邮件相关协议-SMTP SMTP全称是Simple Mail Transfer Protocol,即简单邮件传输协议(25端口号) 它是由一组从源地址到目的地址传输邮件的规范,通过它来控制邮件的中 ...
- iptables综合实验: 两个私有网络的互相通迅
环境准备: 主机A IP:192.168.0.6/24 网关改为192.168.0.8 firewallA IP:eth1 192.168.0.8/24 eth0 10.0.0.8/24 删除默认路由 ...
- JAVA的File对象
文件 1.File对象 java封装的一个操作文件及文件夹(目录)的对象.可以操作磁盘上的任何一个文件和文件夹. 2.创建文件 方式一:根据路径构建一个File对象new File(path) // ...
- Codeforces Round #809 (Div. 2)C.Qpwoeirut And The City
题目大意: 当一栋楼比旁边两栋楼都高的时候,这栋楼为cool,对除了1和n以外的所有楼可以增加任意层,问在满足使最多的楼cool的前提下的花费最小. 当n为奇数的情况下: cool的楼实际上是固定的, ...
- Linux网络通信(线程池和线程池版本的服务器代码)
线程池 介绍 线程池: 一种线程使用模式.线程过多会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务.这避免了在处理短时间任务时创建与销毁线程的 ...