Qt生成带界面的dll给c#调用的例程

QtCreator版本:Qt Creator 4.0.3
Qt版本:Qt 5.6.1 (MSVC 2013,32 bit)
C#程序开发环境:VS2015
电脑:win10
在我的例子中一共有2个工程:
一个是qt的工程:qtdll.pro,用来生成dll,该工程放在
F:\QTCode\TestCode\TestQtDll4CSharp\myQtMainWindowDll文件夹下;
一个是c#的工程:CsharpUseQtDll.sln,用来调用dll,该工程放在
F:\QTCode\TestCode\TestQtDll4CSharp\cSharpUseQtDll\CsharpUseQtDll文件夹下。
我的例程文件夹如下:
Qt生成带界面的dll给c#调用的例程_第1张图片
首先讲一下qt下的qtdll.pro工程,
在Qt Creator中的选项配置如下:
Qt生成带界面的dll给c#调用的例程_第2张图片

qt工程中的文件说明如下:
Qt生成带界面的dll给c#调用的例程_第3张图片
mainwindow界面如下:
Qt生成带界面的dll给c#调用的例程_第4张图片
本工程内的mainwindow.h和mainwindow.cpp内原有的代码不要删除(因为涉及到如何使用外部c#传进来的窗口句柄,怕改错),需要做任何界面的改动直接往上添即可。
main.cpp中代码如下,一共开放了InitialDll(),showDialog(HWND parent)两个接口给c#。
Qt生成带界面的dll给c#调用的例程_第5张图片
注意:c#在调用的时候必须先执行一次InitialDll(),因为qt界面类程序的运行必须依赖于QApplication(argc, 0):

接下来按下Ctrl+B编译生成Release版本的qtdialog.dll,然后将
F:\QTCode\TestCode\TestQtDll4CSharp\build-qtdll-Desktop_Qt_5_6_2_MSVC2015_64bit-Release\release\ qtdialog.dll文件复制到
F:\QTCode\TestCode\TestQtDll4CSharp\QtReleaseDll路径下,然后打开Qt 5.6 64-bit forDesktop(MSVC 2015)
Qt生成带界面的dll给c#调用的例程_第6张图片
输入如下代码:
Qt生成带界面的dll给c#调用的例程_第7张图片
按下回车后就会在该文件夹下生成qtdialog.dll所依赖的库,如下图:
Qt生成带界面的dll给c#调用的例程_第8张图片
好了,接下来说说c#工程,这个工程比较简单,就一个Form1,如下图:
Qt生成带界面的dll给c#调用的例程_第9张图片
Form1主要代码如下:

[DllImport(@".\qtdialog.dll", CallingConvention = CallingConvention.Cdecl)]//导入qtdialog.dll
public static extern void InitialDll();//声明qtdialog.dll里面的一个接口
[DllImport(@".\qtdialog.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]//qtdialog.dll
public static extern bool showDialog(IntPtr parent);//声明qtdialog.dll里面的另一个接口
public Form1()
{
    InitializeComponent();
    InitialDll();//启动QApplication
    Console.WriteLine("hello! InitialDll!");
}

private void button1_Click(object sender, EventArgs e)
{
    Console.WriteLine("hello! button1_Click!");
    bool ret = showDialog(this.Handle);//显示qt窗口界面
}

然后将F:\QTCode\TestCode\TestQtDll4CSharp\QtReleaseDll文件夹下所有文件拷贝到
F:\QTCode\TestCode\TestQtDll4CSharp\cSharpUseQtDll\CSharpUseQtDll\CSharpUseQtDll\bin\Debug路径下,然后在VS中按F5运行c#程序
运行后按下“显示qt窗口”按钮之后,显示如下:
Qt生成带界面的dll给c#调用的例程_第10张图片
注意:
第一次我运行C#程序的时候提示:
无法加载 DLL“.\qtdialog.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
一开始我以为是路径问题,后来才发现是这个dll生成的不对,应为在qt中我用了mingw编译器编译出来的dll,当然无法给C#调用啦。应该在qt中改成msvc编译器。
然后我打开qt发现识别不到c、c++的编译器
后来发现我的Microsoft visual studio 2015的D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC目录里没有vcvarsall.bat,也就是我的电脑里根本没有msvc的编译器,如下图:
Qt生成带界面的dll给c#调用的例程_第11张图片为什么呢?
因为我的VS2015在安装过程中选的默认安装,而默认安装是不包含c++编译器的!
解决方法:
打开VS,然后点击新建项目,选择Visual C++; 出现两个安装选项,选择其中一个安装; 安装完成重新启动VS
这时候qt就能找到MSVC编译器了

工程下载连接:
https://download.csdn.net/download/weixin_43935474/12356408

你可能感兴趣的:(QT,C#,c#调用qt包含界面的dll)