iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt之调用C#的动态库的解决方法
  • 894
分享到

Qt之调用C#的动态库的解决方法

2024-04-02 19:04:59 894人浏览 泡泡鱼
摘要

环境:VS2019+Qt5.12 1. CLR库安装         首先,如果你VS2019没有安装

环境:VS2019+Qt5.12

1. CLR库安装

        首先,如果你VS2019没有安装CLR库,那么操作步骤为:

  • 打开 Visual Studio Installer
  • 在已安装中点击修改
  • 将使用c++的桌面开发的对V142(14.25)生成工具的C++/CLI支持
  • 点击右下角的修改,安装完成后重启软件即可

2. 新建类库(.net Framework)

注意:此处请确认选择用于创建C#类库(.dll)的项目

此时解决方案的视图为:

一个简单的测试直接在Class1.cs文件添加内容即可,此测试中只修改此文件内容


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的类名Class1下的mySetText: {0}", text);
        }
        public void myGetText(ref string text)
        {
            text = "ClassLibrary1的类名Class1下的myGetText";
        }
    }
}

编写好了之后生成dll,将生成的dll复制到CLR的文件路径下

3. 新建CLR类库(.NET Framework)

此时解决方案的视图为:

一个简单的测试对应的头文件ClassLibrary2.h修改即可,此测试中只修改此文件内容


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

这里编写完成后生成dll,然后非常重要的一步来了,将ClassLibrary1.dll、ClassLibrary2.dll、ClassLibrary2.lib准备复制到运行的Qt执行目录下,如果没有在同一个目录下,在ClassLibrary2调用ClassLibrary1时会找不到ClassLibrary1.dll文件而报错

4. Qt调用

4.1. 调用方法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函数
        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. 调用方法2

  • 右键项目->选择添加库->选择外部库
  • 在库文件中找到刚才生成的ClassLibrary2.lib
  • 将平台下的linuxMac取消勾选
  • 将Windows下的所有都取消勾选

此时界面如下


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

到此这篇关于Qt之调用C#的动态库的文章就介绍到这了,更多相关Qt调用C#动态库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt之调用C#的动态库的解决方法

本文链接: https://www.lsjlt.com/news/137898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt之调用C#的动态库的解决方法
    环境:VS2019+Qt5.12 1. CLR库安装         首先,如果你VS2019没有安装...
    99+
    2024-04-02
  • C++调用动态库和Python调用C++动态库的方法是什么
    这篇文章主要介绍“C++调用动态库和Python调用C++动态库的方法是什么”,在日常操作中,相信很多人在C++调用动态库和Python调用C++动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-05
  • C++调用动态库两种方式和Python调用C++动态库
    创建动态库动态库是在程序运行时加载的库文件,并不占用程序本身大小。选择动态库项目:新建.h和.cpp文件:# cat.h #pragma once extern "C" _declspec(dllexport) int sum(int a,...
    99+
    2023-05-14
    Python C++ 动态库
  • P/Invoke之C#调用动态链接库DLL的方法是什么
    这篇文章主要介绍了P/Invoke之C#调用动态链接库DLL的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇P/Invoke之C#调用动态链接库DLL的方法是什么文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • c++动态库调用的实现
    目录一、生成dll二、调用dll在平时的开发中某些情况,动态库和静态库是程序开发的不二法门,例如封装一个库,供别人调用(日志库、字符串处理库、设备信息采集库等),比如接入第三方系统或...
    99+
    2024-04-02
  • android 调用JNI SO动态库的方法
    总结一下: android 调用JNI 分为静态调用与动态调用(不论动态还是静态前提都是NDK环境已经配置好的前提下) 一、静态主要就是将c(.c)或者c++(cpp)的源文件直接加...
    99+
    2024-04-02
  • Rust应用调用C语言动态库的操作方法
    目录外部功能接口FFIUDP套接字的读超时Rust调用C语言动态库中的函数避免重复造轮子,使用Rust官方C语言库外部功能接口FFI 虽然高级(脚本)编程语言的功能丰富,表达能力强,...
    99+
    2023-01-29
    Rust调用C语言动态库 Rust C语言动态库
  • C#WPF调用QT窗口的方法
    WPF 程序内嵌 QT 窗体 1、目标:将QT控件(Qwiget)(或则基于QWiget的控件)(或则任何第三方C++控件)封装为WPF可调用的用户控件。简单来说就是WPF程序调用Q...
    99+
    2023-02-09
    C# WPF调用QT窗口 C# WPF调用QT
  • C#调用C++动态库接口函数和回调函数方法
    目录1. 前言2. 普通接口函数调用示例2.1 C++端编写接口2.2 C#端调用3. 回调函数调用示例3.1 C++端编写接口3.2 C#端调用1. 前言 需求: 当前C已经写好了...
    99+
    2024-04-02
  • php动态库无法加载的解决方法
    这篇文章主要为大家展示了php动态库无法加载的解决方法,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“php动态库无法加载的解决方法”这篇文章吧。php有什么用php是一个嵌套的缩写名称,是英文超级...
    99+
    2023-06-06
  • C++DLL动态库的创建与调用(类库,隐式调用)
    目录1、创建库工程2、添加头文件3、添加cpp文件4、编译dll工程5、创建调用工程6、调用工程 添加cpp文件1、创建库工程 2、添加头文件 ClassDll.h // 宏定义...
    99+
    2024-04-02
  • 详解Struts2动态方法调用
     动态方法就是一个Action对应多个请求,减少Action的数量1、指定method属性<action name="addAction" method="add" class="com.venn.action.HelloWorldA...
    99+
    2023-05-31
    struts2 st
  • android调用JNI SO动态库的方法是什么
    这篇文章主要介绍“android调用JNI SO动态库的方法是什么”,在日常操作中,相信很多人在android调用JNI SO动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”android调用...
    99+
    2023-06-25
  • 在动态库中调用外部函数的方法
    本篇内容介绍了“在动态库中调用外部函数的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!愉快的玩耍比如:...
    99+
    2024-04-02
  • golang调用c语言动态库方式实现
    下面我们自己在 Linux 下做一个动态库(.so 文件 - Shared Object),然在用 Go 来使用它。本文所用的操作系统为 Ubuntu18.04, 以 gcc 作为编...
    99+
    2024-04-02
  • python调用c++动态库dll时的参数传递问题怎么解决
    本篇内容介绍了“python调用c++动态库dll时的参数传递问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!stringC++生...
    99+
    2023-06-29
  • Golang使用反射的动态方法调用详解
    Go是一种静态类型的语言,提供了大量的安全性和性能。静态类型的好处之一是,编译器可以在编译时捕获错误,防止在运行时发生。 在Go中,方法是用语法func(receiverName r...
    99+
    2023-03-14
    Golang反射动态方法调用 Golang反射动态方法 Golang反射
  • c/c++静态库之间相互调用的实战案例
    目录一、c++项目如何调用c的库(以静态库为例)1.将栈的源文件和头文件拷贝一份到Stack_c.lib这个项目的路径下2.打包成静态库3.建立一个c++项目(TestStackli...
    99+
    2022-11-13
    c语言调用c++静态库 调用c++动态库 C++调用静态库
  • GCC 指令详解及动态库、静态库的使用方法
    目录一、GCC1.1 GCC 介绍1.2 安装 GCC1.3 GCC 工作流程1.3.1 一般使用流程1.3.2 详细的工作流程1.4 GCC 常用参数1.4.1 指定一个宏(-D)...
    99+
    2022-11-13
    GCC 指令 GCC使用动态库 GCC使用静态库
  • C++ 虚拟函数与动态调派:理解运行时方法调用的机制
    虚拟函数允许派生类重写基类方法,动态调派则根据对象类型在运行时确定调用哪个函数。具体步骤包括:通过 virtual 声明虚拟函数,允许派生类重写。在派生类中重写虚拟函数,提供特定实现。使...
    99+
    2024-04-28
    c++ 虚拟函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作