QT调用C#写的Dll

参见: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
相关文章
相关标签/搜索