一、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中^显示为:
- 使用gcnew创建对象
注:gcnew关键字
C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换*,就语义上来说他们的区别大致如下:
- gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址
- gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放
从程序员的角度来说,管它是句柄还是什么其他的东西,总跑不掉是对某块内存地址的引用,实际上我们都可以理解成指针