从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主机时间同步
yum -y install ntpdate ntp && ntpdate cn.pool.ntp.org systemctl start ntpd.service && ...
- Alertmanager配置概述
Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在Alertmanager配置中一般会包含以下几个主要部分: 全局配置(global):用于定义一些全局的公共参数,如 ...
- 1_Layui
一. 引言 官网: https://www.layui.com/ 在官网首页, 可以很方便的下载Layui Layui是一款经典模块化前端UI框架, 我们只需要定义简单的HTML,CSS,JS即可实现 ...
- Linux+Wine运行QQTIM (2022年9月)
测试的版本Tim3.4.0 QQ9.6.7 如果你的系统没有Wine先装Wine,Wine在各大发行版的源都能找到.记住32位和64位的Wine都要装 去https://tubentubentu.pa ...
- 微信小程序第三方授权登录
登录流程时序图: 1.调用uni.getProvider()获取服务供应商,参数service确定是选择对应的什么操作,此处选择授权登录oauth 代码如下: 2.调用登录接口uni.login(), ...
- 银行ATM存取款系统(C语言实现)
这里使用的运行工具是DEV C++.老铁们一定要看仔细了.是DEV C++ 仅供借鉴:这个是大一时期写的.大四的时候整理了一下(本人C语言学的也不太好).肯定很多不足和存在漏洞的地方.仅供借鉴.仅供借 ...
- python字典推导&&列表推导&&输出随机数
字典推导: x = ['A', 'B', 'C', 'D'] y = ['Alice', 'Bob', 'Cecil', 'David'] print({i:j for i,j in zip(x,y) ...
- python制作一个小型翻译软件
from urllib import parse,request import requests,re,execjs,json,time 英语查词翻译 class Tencent(): def ini ...
- Python 根据两个字段排序 中文排序 汉字排序 升序 降序
Python3写法 代码 # -*- coding: utf-8 -*- # 需求:年龄倒序,姓名正序 from itertools import chain from pypinyin import ...
- SpringBoot报错: No identifier specified for entity: XXX.XXX.XXX.XXX
今天练习的时候报错说是 : 没有为实体指定标识符 仔细看了实体类才发现忘记写了一些注解 用JPA写实体类时一些注解是必须的 @entity 标名本类是实体类 @table(name="表名 ...