一、QT下的C++项目调用C#生成的DLL

1. 环境配置

Qt是不能直接调用C#生成的dll,本文使用方法是将C#的编写的dll通过CLR编译成lib,首先需要在VS下添加一个组件,以VS2019为例,点击工具->获取工具和功能,打开以下页面,选择使用C++的桌面开发,勾选C++/CLI支持,等待工具下载完成。

2. 编写简单的C#库

新建一个C#类库项目

为做演示,只写了一个加法

写好以后点击生成

生成的dll文件等下会用得上

3. 使用CLR生成Lib

首先新建一个CLR项目,命名位Cdll

把C#生成的CSdll.dll复制到工程里来

项目刚建好的页面如下,我们要做一些修改

左边是修改好后的Cdll.h,代码中要加上#using,右边是上面写的C#代码

改完过后就可以生成了,在生成之前可以根据自己的要使用的Qt位数选择对应的生成位数,我选择的是64位

生成的DLL和Lib就能在QT中调用了

注:因为我选择的是64位,所以是X64里的Debug,不要选错了Debug文件夹

4. 新建QT工程

因为上面选用的是64位,所以这里也采用64位

建好项目以后,把上面的Cdll.lib放到工程下,一定记住是X64里的Cdll.lib,不要选错了

接下来我们来添加库

最后点击完成就行,添加好了以后运行一下,把Cdll.dll和CSdll.dll放到生成的exe同级目录下

修改代码如下,运行后就可以看到运算结果,到此也就实现Qt引用C#编写的dll

要注意函数名的对应,左边是QT工程,右边是CLR工程

二、VS2019下的C++项目调用C#生成的DLL

1. 创建C#类库

如果你的C++程序不是在QT下进行编译,而是同样在VS2019下,则采用这种方法,即虚拟化方式调用(CLR),首先创建一个C#库,得到一个dll,和QT下的C#库创建方式一样,在此不做赘述,代码如下

2. 创建C++工程

接下来新建一个C++工程,按照下述方式编写,我是把dll文件复制到了C++项目的文件夹里,所以直接引用dll文件名,正常情况应该把引用路径写清楚

可以看到,传入3和4,运行的结果是7,没问题,完成了VS下的C++项目对C#的dll库的调用

3. 设置公共语言运行支持属性

注:该方法需要设置公共语言运行支持属性,否则无法识别,在项目的配置属性里选择高级,公共语言那一栏要改成支持/CLR

以下几点需要记住

1、使用#using引用C# DLL,而不是#include

2、别忘using namespace ClassLibrary1;

3、使用C++/clr语法,采用正确的访问托管对象,即:使用'^',而不是星号'*'

在vs中^显示为:

  1. 使用gcnew创建对象

注:gcnew关键字

C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换*,就语义上来说他们的区别大致如下:

  1. gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址
  2. gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放

从程序员的角度来说,管它是句柄还是什么其他的东西,总跑不掉是对某块内存地址的引用,实际上我们都可以理解成指针

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐