最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt之調(diào)用C#的動(dòng)態(tài)庫(kù)的解決方法

 更新時(shí)間:2021年10月12日 16:03:10   作者:Suifqwu  
這篇文章給大家介紹了Qt之調(diào)用C#的動(dòng)態(tài)庫(kù)的解決方法,環(huán)境使用的是VS2019+Qt5.12,感興趣的朋友一起看看吧

環(huán)境:VS2019+Qt5.12

1. CLR庫(kù)安裝

        首先,如果你VS2019沒(méi)有安裝CLR庫(kù),那么操作步驟為:

  • 打開(kāi) Visual Studio Installer
  • 在已安裝中點(diǎn)擊修改
  • 將使用C++的桌面開(kāi)發(fā)的對(duì)V142(14.25)生成工具的C++/CLI支持
  • 點(diǎn)擊右下角的修改,安裝完成后重啟軟件即可

2. 新建類庫(kù)(.NET Framework)

注意:此處請(qǐng)確認(rèn)選擇用于創(chuàng)建C#類庫(kù)(.dll)的項(xiàng)目

此時(shí)解決方案的視圖為:

一個(gè)簡(jiǎn)單的測(cè)試直接在Class1.cs文件添加內(nèi)容即可,此測(cè)試中只修改此文件內(nèi)容

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

編寫(xiě)好了之后生成dll,將生成的dll復(fù)制到CLR的文件路徑下

3. 新建CLR類庫(kù)(.NET Framework)

此時(shí)解決方案的視圖為:

一個(gè)簡(jiǎn)單的測(cè)試對(duì)應(yīng)的頭文件ClassLibrary2.h修改即可,此測(cè)試中只修改此文件內(nèi)容

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

這里編寫(xiě)完成后生成dll,然后非常重要的一步來(lái)了,將ClassLibrary1.dll、ClassLibrary2.dll、ClassLibrary2.lib準(zhǔn)備復(fù)制到運(yùn)行的Qt執(zhí)行目錄下,如果沒(méi)有在同一個(gè)目錄下,在ClassLibrary2調(diào)用ClassLibrary1時(shí)會(huì)找不到ClassLibrary1.dll文件而報(bào)錯(cuò)

4. Qt調(diào)用

4.1. 調(diào)用方法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函數(shù)
        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. 調(diào)用方法2

  • 右鍵項(xiàng)目->選擇添加庫(kù)->選擇外部庫(kù)
  • 在庫(kù)文件中找到剛才生成的ClassLibrary2.lib
  • 將平臺(tái)下的linux、Mac取消勾選
  • 將Windows下的所有都取消勾選

此時(shí)界面如下

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

到此這篇關(guān)于Qt之調(diào)用C#的動(dòng)態(tài)庫(kù)的文章就介紹到這了,更多相關(guān)Qt調(diào)用C#動(dòng)態(tài)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

吴桥县| 松原市| 达州市| 吴堡县| 濮阳县| 息烽县| 瑞金市| 上犹县| 铜鼓县| 昌乐县| 金阳县| 济源市| 崇文区| 新余市| 深泽县| 从江县| 阿克| 泰和县| 沈阳市| 唐海县| 苏尼特左旗| 改则县| 长子县| 平湖市| 靖宇县| 海盐县| 高淳县| 剑阁县| 桦南县| 江阴市| 乌鲁木齐县| 毕节市| 镇雄县| 邯郸县| 乐安县| 黑水县| 霍山县| 旬邑县| 府谷县| 灌南县| 错那县|