1. 程式人生 > >QT調用C#寫的Dll

QT調用C#寫的Dll

cal com deb 編譯環境 mod 函數名 load() src system

參見:

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。

---------------------
編譯環境為:VS2010

C++ 中要加 extern "C"才行,不然生成後的DLL使用DLL查看器可以發現函數名前會是“int __cdecl api_add(int,int)”這種樣子,無法使用。

技術分享圖片

加了 extern "C" 後再編譯發現是標準的C DLL庫了。

技術分享圖片

// CppDll.h

#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);
}

--------------

其他相同

QT引用方式,三種

第一種、引用lib文件進行編譯

1、pro文件加  

  LIBS += -LF:/QT5.11/TestCSharpDll -lCppDll

2、在CPP中聲名 

extern "C" __declspec(dllexport) int api_add(int a, int b);
extern "C" __declspec(dllexport) void api_showBox(const char* content);

3、然後就可以直接使用了

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



 

QT調用C#寫的Dll