參見:api
https://blog.csdn.net/weixin_42420155/article/details/81060945函數
C#寫的dll是沒有dllMain入口函數的,是一種中間語言,須要.Net運行時進行作本地化工做,所以若是要調用C#寫的dll,須要依賴.Net運行時,然而Qt中還沒法直接調用.Net運行時,最好的方式是可以在Qt中直接調用C#dll的函數,可是Qt明顯只能調用C++寫的dll,因此就只能經過編寫一個C++的dll導出接口供Qt調用,這個C++編寫的dll對C#寫的dll進行封裝,這個C++的dll能夠採用/CLR方式對C#編寫的dll進行引用的,即將C++編寫的dll中生成的.lib文件供Qt進行連接,因爲該接口符合C++規範,因此Qt能夠連接到對應的C++編寫的dll。
---------------------
編譯環境爲:VS2010spa
C++ 中要加 extern "C"才行,否則生成後的DLL使用DLL查看器能夠發現函數名前會是「int __cdecl api_add(int,int)」這種樣子,沒法使用。.net
加了 extern "C" 後再編譯發現是標準的C DLL庫了。3d
// CppDll.hblog
#pragma once
using namespace System::Reflection;
using namespace System;接口
extern "C" __declspec(dllexport) int api_add(int a, int b)
{
CSharpDll::CSharpClass obj;
return obj.add(a, b);
}
extern "C" __declspec(dllexport) void api_showBox(const char* content)
{
CSharpDll::CSharpClass obj;
String^ str = gcnew String(content);
obj.showBox(str);
}ci
--------------字符串
其餘相同io
QT引用方式,三種
第一種、引用lib文件進行編譯
一、pro文件加
LIBS += -LF:/QT5.11/TestCSharpDll -lCppDll
二、在CPP中聲名
extern "C" __declspec(dllexport) int api_add(int a, int b);
extern "C" __declspec(dllexport) void api_showBox(const char* content);
三、而後就能夠直接使用了
qDebug()<<"C# DLL add:"<<api_add(8,5);
第二種、直接C++方式調用C++DLL
//純C++方式調用
typedef int(CALLBACK *funci)(int,int);
HINSTANCE hdll=LoadLibrary(L"MyDll2.dll"); //L指寬字符串,若不寫L,則會出現錯誤,詳情請自查
funci t3=(funci)GetProcAddress(hdll,"_ZN6MyDll26lllsumEii");//這裏原先寫的函數名爲「sum」可是QT編譯後的DLL,經過DLL查看器會發現 函數名變了,因此調用時須要使用DLL查看器獲得的這個名字才行,否則沒法調用成功。
qDebug()<<"C++ mode:"<<t3(9,9);
第三 種、QT的顯示調用
//MyDll test-----------------------
typedef int (* fun)(int,int );
QLibrary mylib("MyDll.dll");
//qDebug()<<"in dll function";
if(mylib.load())
{
//qDebug()<<"加載DLL OK";
fun fun1 = (fun)mylib.resolve("sum");
//qDebug()<<"MyDLL open:"<<fun1;
if(fun1)
{
qDebug()<<"resolve DLL OK";
int ret = fun1(26,500);
qDebug()<<"resolve MyDLL add:"<<ret;
}else{
qDebug()<<"resolve MyDLL 失敗";
}
}else{
qDebug()<<"加載DLL 失敗";
}
//MyDll test-----------------------end