IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C# 调用Qt 库 -> 正文阅读

[C++知识库]C# 调用Qt 库

因公司大部分底层库使用的Qt 开发,本人比较擅长C# ,且领导计划应用层用C# 而算法层用C++或者Qt,这就出现了混合编程的方式,现对C#的平台调用做一下总结。

公共语音运行库提供了一系列能够使托管代码与非托管代码进行交互的解决方案

主要包含三类互操作技术:

1. 平台调用(P/Invoke):主要用于处理在托管代码中调用C库函数以及Win32 API 函数等非托管函数情形。

2.C++ Interop:适用在托管代码与C++ 类库、核心算法库之间进行高效、灵活的互操作过程。

3.COM Interop:该技术用于处理托管代码与COM之间的交互过程。

注:以上参考<<精通.NET 互操作:P/Invoke,C++ Interop和COM Interop>> 黄际洲。

此文章采用方案2 实现C# 对Qt 库的调用。

因为Qt 中的信号和槽机制是无法通过CLR C++直接封装的(原因1:CLR C++ 继承的Object,Qt 中的类大部分继承QObject,CLR C++不支持多继承,所以无法将Qt信号和槽转换为 委托的形式,CLR C++可以封装没有使用信号和槽的Qt类,但是为了结构上统一不建议这样做)

调用过程:

1. 一般C# 调用 C++ 情况

C# ------> 托管 C++----->非托管C++

2. C# 调用Qt

C#---->托管C++--->非托管C++--->Qt

故 C# 调用Qt 多了一层 通过非托管C++ 封装Qt的过程(此过程主要是为了屏蔽Qt的信号和槽,将信号和槽转换为C++中的回调)

下面正式开始封装演示,以加法运算为例 (此文章需要对Qt 、C# 环境搭建及开发有一定基础)

实验环境:

Windows10 、VS2019、Qt 5.14。

1. 在 VS中新建 Qt项目 “MathHelper”,并创建 MathHelper 导出类,在头文件定义int Add(int data1,int data2);函数,并在cpp 文件中实现。

使MathHelper继承至QObject,并添加Q_OBJECT宏。

说明:

用途: 此项目用于模拟已存在的Qt库。

2. 在VS中新建 Qt项目 “MathHelperWrapper”,并创建 MathHelperStdWrapper 导出类(如果创建项目过程中默认创建了"MathHelperWrapper.h/cpp"等文件建议将其重新命名为MathHelperStdWrapper )。

项目右键->高级->公共语言运行时支持-> 选择"公共语言运行时支持(clr)"

C/C++-->语言-->符合模式-->否。

选择MathHelperWrapper.cpp 右键 C/C++->常规-->公共语言运行时支持->选择"无公共语言运行时支持",此类的主要作用是将Qt转换为标准C++ 所以不需要CLR支持。

在此项目新建 MathHelperCLRWrapper类,并设置为公开类。

?分别在?MathHelperStdWrapper? MathHelperCLRWrapper 类中创建 Add方法的封装以及 MathHelper MathHelperStdWrapper 对象指针,见图

?

?在cpp文件构造函数中创建对应的对象,以及Add函数的封装。

说明:

此项目主要完成了Qt到CLR C++ 的转换(C# 是可以直接调用CLR C++的)。

..StdWrapper 代表了标准C++(非托管)封装,...CLRWrapper 代表了CLR封装。

此程序集完成了Qt 到CLR C++ 转换,其中包含两个过程

a. Qt-->标准C++(MathHelperStdWrapper? 类)

b. 标准C++->CLR C++。(MathHelperCLRWrapper? 类)

这两个转换过程分别放置于同一项目不同类中,其实也可以放置在两个不同项目中(一个项目用于Qt到标准C++的转换,另外一个项目用于标准C++到CLR C++ )

此项目开始创建时选择Qt项目(而不是标准C++等)是因为1. 在Qt->标准C++转换过程中依然会用到Qt的头文件等,所以这样创建以后就默认包含了Qt头文件和库文件路径,无需在手动添加,2.使用Qt 的编译环境编译标准C++

----------------------20220307:23:03-----------------------未完待续

3. 新建C#控制台项目MathHelperDemo

?在项目引用中右键添加引用,选择MathHelperWrapper

在 main函数中添加测试代码:

4.编译解决方案

5.将 MathHelper 编译好的dll放置于MathHelperDemo运行目录下(否则会报dll找不到情况)

如图:

7.运行

测试成功。

此项目建立了一个调用过程的简单结构

下一步计划:

1.增加信号和槽封装过程

2.梳理常见数据类型了转换过程(字符串、数组、指针、引用)

3.CLR C++ 不支持标准C++ 多线程问题。

注:
测试过程中出现了一个问题

这是因为在编译时C++ 与C# 选择的CPU平台类型不一致导致的,将平台统一改为x64或者x32 统一就可以了

代码连接

链接:https://pan.baidu.com/s/12hOj26tRvktXM9jM4_5ucA
提取码:vjx7

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:13:22  更:2022-03-10 22:15:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:42:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码