Qt之調(diào)用C#的動(dòng)態(tài)庫(kù)的解決方法
環(huán)境:VS2019+Qt5.12
1. CLR庫(kù)安裝
首先,如果你VS2019沒(méi)有安裝CLR庫(kù),那么操作步驟為:
- 打開(kāi) Visual Studio Installer
- 在已安裝中點(diǎn)擊修改
- 將使用C++的桌面開(kāi)發(fā)的對(duì)V142(14.25)生成工具的C++/CLI支持
- 點(diǎn)擊右下角的修改,安裝完成后重啟軟件即可
2. 新建類(lèi)庫(kù)(.NET Framework)
注意:此處請(qǐng)確認(rèn)選擇用于創(chuàng)建C#類(lèi)庫(kù)(.dll)的項(xiàng)目
此時(shí)解決方案的視圖為:

一個(gè)簡(jiǎn)單的測(cè)試直接在Class1.cs文件添加內(nèi)容即可,此測(cè)試中只修改此文件內(nèi)容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary1
{
public class Class1
{
public Class1() { }
public int myAdd(int a, int b)
{
int c = a + b + 5;
return c;
}
public void mySub(int a, int b, ref int c)
{
c = a - b - 5;
}
public void mySetText(string text)
{
Console.WriteLine("ClassLibrary1的類(lèi)名Class1下的mySetText: {0}", text);
}
public void myGetText(ref string text)
{
text = "ClassLibrary1的類(lèi)名Class1下的myGetText";
}
}
}
編寫(xiě)好了之后生成dll,將生成的dll復(fù)制到CLR的文件路徑下
3. 新建CLR類(lèi)庫(kù)(.NET Framework)
此時(shí)解決方案的視圖為:

一個(gè)簡(jiǎn)單的測(cè)試對(duì)應(yīng)的頭文件ClassLibrary2.h修改即可,此測(cè)試中只修改此文件內(nèi)容
#pragma once
using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::InteropServices;
#using "./ClassLibrary1.dll"
using namespace ClassLibrary1;
extern "C" __declspec(dllexport) int MyAdd(int a, int b)
{
ClassLibrary1::Class1 obj;
return obj.myAdd(a, b);
}
extern "C" __declspec(dllexport) void MySub(int a, int b,int *c)
{
ClassLibrary1::Class1 obj;
return obj.mySub(a, b, *c);
}
extern "C" __declspec(dllexport) void MySetText(char* text)
{
ClassLibrary1::Class1 obj;
String^ str = gcnew String(text);
obj.mySetText(str);
}
extern "C" __declspec(dllexport) void MyGetText(char** text)
{
ClassLibrary1::Class1 obj;
String^ str = gcnew String("");
obj.myGetText(str);
*text = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
}
這里編寫(xiě)完成后生成dll,然后非常重要的一步來(lái)了,將ClassLibrary1.dll、ClassLibrary2.dll、ClassLibrary2.lib準(zhǔn)備復(fù)制到運(yùn)行的Qt執(zhí)行目錄下,如果沒(méi)有在同一個(gè)目錄下,在ClassLibrary2調(diào)用ClassLibrary1時(shí)會(huì)找不到ClassLibrary1.dll文件而報(bào)錯(cuò)
4. Qt調(diào)用
4.1. 調(diào)用方法1
#include <QCoreApplication>
#include <windows.h>
#include <QDebug>
#include <QLibrary>
#include <QFile>
typedef int (*ADD)(int,int);
typedef void (*SUB)(int,int,int *);
typedef void (*SHOW)(QString);
int main(int argc, char *argv[])
{
QLibrary mylib("ClassLibrary2.dll"); //聲明dll文件
if (mylib.load()) //判斷加載是否成功
{
qDebug() << "DLL loaded!";
ADD add = (ADD)mylib.resolve("MyAdd"); //鏈接到add函數(shù)
qDebug() << "add status: " << add;
if (add){
qDebug()<< "Link to add Function is OK!" << add(3,2) ;
}
SUB sub = (SUB)mylib.resolve("MySub");
qDebug() << "sub status: " << sub;
if (sub){
int c = 10;
sub(3,2,&c);
qDebug()<< "Link to sub Function is OK!" << c;
}
SHOW show = (SHOW)mylib.resolve("MySetText");
qDebug() << "show status: " << show;
if (show){
qDebug()<< "Link to show Function is OK!" ;
const char *buf = "helloworld";
show(buf);
}
qDebug()<< "DLL unload " << mylib.unload ();
}
else
{
qDebug()<< "DLL is not loaded!" ;
}
return 0;
}
4.2. 調(diào)用方法2
- 右鍵項(xiàng)目->選擇添加庫(kù)->選擇外部庫(kù)
- 在庫(kù)文件中找到剛才生成的ClassLibrary2.lib
- 將平臺(tái)下的linux、Mac取消勾選
- 將Windows下的所有都取消勾選
此時(shí)界面如下

extern "C" __declspec(dllexport) void MyGetText(char **p);
extern "C" __declspec(dllexport) void MySetText(char *p);
int main(int argc, char *argv[])
{
MySetText(QString("helloworld").toUtf8().data());
char* change_t=nullptr;
MyGetText(&change_t);
qDebug() << QString(change_t);
}
到此這篇關(guān)于Qt之調(diào)用C#的動(dòng)態(tài)庫(kù)的文章就介紹到這了,更多相關(guān)Qt調(diào)用C#動(dòng)態(tài)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#區(qū)分中英文按照指定長(zhǎng)度截取字符串的方法
這篇文章主要介紹了C#區(qū)分中英文按照指定長(zhǎng)度截取字符串的方法,涉及C#操作字符串的正則匹配與截取等常用操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
C#中調(diào)用SAPI實(shí)現(xiàn)語(yǔ)音識(shí)別的2種方法
這篇文章主要介紹了C#中調(diào)用SAPI實(shí)現(xiàn)語(yǔ)音識(shí)別的2種方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
C# 復(fù)制指定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)到新建的節(jié)點(diǎn)下
這篇文章主要介紹了C# 復(fù)制指定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)到新建的節(jié)點(diǎn)下的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10

