接上篇,Qt程序中调用C#编写的dll https://blog.csdn.net/weixin_42420155/article/details/81060945
在Windows平台上的Qt分为MSVC和Mingw版
上篇为MSVC版的Qt进行调用,有网友留言和发邮件询问MingW版的Qt能否使用上篇“Qt程序中调用C#编写的dll”的那些调用方法。
首先,Qt本身也是用C++的,因此问题实质上是Mingw版的C++如何调用MSVC版C++编写的dll。
本文介绍两种常规方式。
一.通常MSVC写的dll里面的导出接口如果是普通C++编译方式,函数名称会变更(如add函数会变为 ?add7Z@N 之类),MingW里面resolve时可以直接就按变更后的接口进行如QLibrary.resolve("?add7Z@N"),这虽然算一种方法,但会不会给人一种乱码感觉?
二.MingW和MSVC的C调用接口是兼容的,C++接口需要特殊转换重构才可以实现dll互相调用(这个问题展开就有点大篇幅了,本文只针对Qt里面快速调用C#编写的dll而言),在这里C调用接口需要用到extern "C" 进行导出。(在导出后可以通过在mingw版的Qt通过链接该lib文件;或者extern "C"导出后继续采用上面第一种方式进行resolve,此时的resolve就可以直接用函数名,而没有两端的多余的?@N之类的符号了)
下面分别介绍两种方式的做法,针对两种方法写一篇Demo,希望对查找该资料的人有帮助吧。demo的过程如下:
编写环境:Win7,Qt5.3.2(mingw_x86),VS2013
1.打开VS2013,新建一个C#的Class Library项目(这里选择的是.Net Framework 4),项目名为CSharpDllMingW(与前篇相比,后面加了个MingW以示区分)
2.由于默认没有引入Forms等UI库,先在reference中添加引用System.Windows.Forms以便可以在测试中使用MessageBox等
3.最终C#编写的dll如下图,命名空间为CSharpDllMingW,公共类为CSharpClassMingW