QT调用C#写的Dll

参见:

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


 

原文地址:https://www.cnblogs.com/darkdance/p/10208156.html

时间: 2024-10-11 11:30:30

QT调用C#写的Dll的相关文章

Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this);     QFileInfo fileinfo(appUrl);     QString appPath = QApplication::applicationDirPath()+SAVEDIR+"/"+fileinfo.fileName();     bool res = proce

C#程序调用C++写的dll传递string出现bad ptr

本来是做C/C++的,因为项目需要,所以才搞的C#,说实话,很鄙视做C#的,总结起来,扯淡的DllImport,有本事别用这破玩意,看你C#还能干啥? 参考网上的按照下面的方式来,结果在C++的dll库中打断点,第二个参数怎么都是bad ptr,郁闷至极,耗费了两天的功夫,都没有搞定,也参考了:http://blog.csdn.net/yongshengsilingsa/article/details/7917877 的文章,也无济于事.最后就索性自己再写个简单的dll和exe,只有一个接口,调

Delphi7程序调用C#写的DLL解决办法(转)

近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一个"类库"项目TestDll,using System.Runtime.InteropServices;namespace TestDll{public interface  I TestClass  {     void YourProcedure(stirng param1);}[Cla

c++ c# java 调用 c++ 写的dll

1. vs 中新建win32 dll 项目   testdll 添加实现文件       test.cpp #include "stdafx.h" #include <iostream>using namespace std;int Add(int plus1, int plus2){ int add_result = plus1 + plus2; return add_result;} 添加模板定义文件 LIBRARY "testdll"EXPORTS

发现个delphi调用vc写的Dll中包含pchar参数报错奇怪现象

发现个delphi调用vc写的Dll中包含pchar参数奇怪现象 procedure中的第一行语句不能直接调用DLL的函数,否则会运行错,在之前任意加上条语句就不报错了奇怪! vc的DLL源码地址 http://blog.csdn.net/lqena/article/details/46357165 Delphi源码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co

lua调用C++写的DLL实现“热更新”

原创作品,转载请注明来源是CSDN:http://blog.csdn.net/relar/article/details/38084689 开发游戏服务器往往有"热更新"的需求,就是在不停止服务程序的情况下,对服务程序进行升级.这里采用lua脚本桥接C++的模式.程序主框架用C++,程序的业务逻辑也是C++(具体的是C++写的DLL),这两者之间用LUA脚本语言进行桥接.当程序运行时,只要改变LUA脚本,即可以选择使用不同的DLL,以实现业务逻辑的升级更新. 上演示代码,代码分为三部分

Unity中C#调用C++写的DLL之Swig篇

hash索引btree索引聚簇索引非聚簇索引 安装AndroidSDK的一些坑与注意点 近来要用Unity打包到安卓上玩, Unity那边需要用到服务器中用C++写的库,对比了 P/Invoke 和 C++/CLI 两种方式, 都不够省心省力, 决定使用 Swig来撸. 教程基本上按照这篇文章就可以, 文章写得非常详尽, 但文中关于设置 swiglib.i 自定义生成工具的命令行的时候, 他文中的下面一段要注意 : 在常规中选择命令行并且写入: echo on $(SolutionDir)/..

QT 调用VS2015编写的Dll

最近在用QT调用VC生成的库,QT使用的是MinGW调试器,出现与动态库不兼容的问题,最后发现QT只能识别VC生成的C格式下的动态库 也就是在导入导出设置时加入extern "C" .如extern "C" __declspec(dllexport),不能兼容类库.QT调用动态库时的步骤如图:1.将生成的这3个文件加入QT工程的目录下. 2.点击添加文件和添加外部库,如图   最后 include 头文件就可以使用了. 最后提醒大家:注意区分64 位和32位 以免不

Delphi调用C++写的dll示例

最近做一个读市民卡的项目,读卡器公司提供的读市民卡dll是用C++写的. 下面记录一些自己的心得,供需要的朋友参考. 声明dll函数要加上stdcall关键字,否则可能会报地址非法的错误. 代码: unit cMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ComCtrls,ActiveX, E