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

Qt程序中調(diào)用C#編寫的dll(推薦)

 更新時間:2020年04月01日 16:44:12   作者:風向晚。  
這篇文章主要介紹了Qt程序中調(diào)用C#編寫的dll,本文圖文并茂給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1、打開Visual Studio,新建一個C#的Class Library項目(這里選擇的是.Net Framework 4),項目名為CSharpDll。

2、由于默認沒有引入Forms等UI庫,先在reference中添加引用System.Windows.Forms以便可以在測試中使用MessageBox等。

3、最終C#編寫的dll的源代碼如下圖所示,命名空間為CSharpDll,公共類為CSharpClass。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharpDll
{
 public class CSharpClass
 {
 public CSharpClass() { }
 public int add(int a , int b)
 {
 return a + b;
 }

 public void substract( int a , int b , ref int c)
 {
 c = a - b;
 }

 public static void showBox(string str)
 {
 MessageBox.Show("C#:" + str);
 }
 }
}

里面包含一個加法add,一個減法substract(為了測試指針,所以在減法的返回類型是void,而把計算結(jié)果通過ref參數(shù)c給返回),一個showBox方法(里面采用C#的MessageBox對話框顯示用戶輸入的參數(shù)字串)

4、對project進行release build,在release目錄下生成了CSharpDll.dll(待會用到)。

5、關閉CSharpDll項目,另外新建一個C++ CLR類型的Class Library項目(選擇與C#項目相同的.Net Framework 4),項目名稱為CppDll。

一開始我用的VS2019,發(fā)現(xiàn)VS2019好像無法新建 C++ CLR類型的Class Library項目了,所以學習微軟的技術一定要小心,學習主流的支持很久的技術,盡量不要學習新出的技術,如果必須學新技術,一定要認真考量,一些邊緣化的技術一定不要學習,沒準哪天微軟就不維護了。

6、選擇Project->CppDll Properties…,在彈出的屬性頁面選擇“Add New Reference..”,點擊“browsing.”后選擇CSharpDll項目中release目錄下的CSharpDll.dll。

7、選擇CSharpDll.dll后,可以看到在項目屬性的References中出現(xiàn)了CSharpDll這個Library。

8、在CppDll項目中的CppDll.h中利用 _declspec(dllexport)導出對應的3個接口函數(shù)add,substract,showBox 。需要using namespace System::Reflection,對于這里的showBox,其參數(shù)不能采用CSharpDll里面的showBox參數(shù)的String類型,而是使用const char* 類型。

主要代碼如下所示:

// CppDll.h

#pragma once

using namespace System;
using namespace System::Reflection;

__declspec(dllexport) int add(int a, int b)
{
	CSharpDll::CSharpClass obj;
	return obj.add(a, b);
}

__declspec(dllexport) void substract(int a, int b, int *c)
{
	CSharpDll::CSharpClass obj;
	obj.substract(a, b, *c);
}

__declspec(dllexport) void showBox(const char* content)
{
	CSharpDll::CSharpClass obj;
	String^ str = gcnew String(content);
	obj.showBox(str);
}

namespace CppDll {

	public ref class Class1
	{
		// TODO: 在此處添加此類的方法。
	};
}

9、選擇release方式build CppDll項目,在release文件夾中生成了CppDll.dll文件,可以看到同時其也將引用的CSharpDll.dll也給拷貝到release文件夾中了。

10、接下來在Qt中進行調(diào)用, 在QtCreator中新建一個TestCSharpDll GUI項目,編譯器選的mingw。通過VS自帶的命令行工具中的dumpbin工具可以查看CppDll.dll導出的函數(shù)接口。

dumpbin -exports (+dll路徑)

在TestCSharpDll工程中通過typedef定義函數(shù)指針,同時采用QLibrary動態(tài)加載并resolve函數(shù)。

在這里.dll的路徑設為當前目錄下“./CppDllMingW.dll”,也就是編譯好的程序exe同一目錄下的dll,去resolve由普通導出方式的接口即“?add@@YAHHH@Z”。

主要代碼如下所示:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QLibrary>
#include<QMessageBox>
typedef int (*x_add)(int a , int b);
typedef void (*x_substract)(int a , int b , int* c);
typedef void (*x_showBox)(const char* content);

MainWindow::MainWindow(QWidget *parent) :
 QMainWindow(parent),
 ui(new Ui::MainWindow)
{
 ui->setupUi(this);
}

MainWindow::~MainWindow()
{
 delete ui;
}

//add
void MainWindow::on_pushButton_clicked()
{
 int a = ui->lineEdit->text().toInt();
 int b = ui->lineEdit_2->text().toInt();
 QLibrary library("./CppDll.dll");
 if(library.load()){
 x_add add = (x_add)library.resolve("?add@@YAHHH@Z");
 if(add){
 QString str = QString::number(add(a , b));
 QMessageBox::information(this , "call add from dll" , str);
 }
 }
}

//sub
void MainWindow::on_pushButton_2_clicked()
{
 int a = ui->lineEdit_3->text().toInt();
 int b = ui->lineEdit_4->text().toInt();
 int c = 0;
 QLibrary library("./CppDll.dll");
 if(library.load()){
 x_substract sub = (x_substract)library.resolve("?substract@@YAXHHPAH@Z");
 if(sub){
 sub(a , b , &c);
 QString str = QString::number(c);
 QMessageBox::information(this , "call sub from dll" , str);
 }
 }
}

//showBox
void MainWindow::on_pushButton_3_clicked()
{
 QLibrary library("./CppDll.dll");
 if(library.load()){
 x_showBox showBox = (x_showBox)library.resolve("?showBox@@YAXPBD@Z");
 if(showBox){
 showBox("showBox!");
 }
 }
}

編譯TestCSharpDll工程,將CppDll.dll和CSharpDll.dll復制到同一目錄下,執(zhí)行TestCSharpDll.exe,可看出點擊按鈕后,通過QLibrary進行動態(tài)resolve,均正常調(diào)用。

 

調(diào)用add函數(shù)

 

調(diào)用sub函數(shù)

 

調(diào)用showBox函數(shù)

最好是將相關dll置于同一目錄下運行,不然會出現(xiàn)“未能加載文件或程序集”的異常。針對.lib鏈接方式,理應是置于同一目錄下。而針對QLibrary進行resolve方式,可能通常一開始的想法是,CppDll.dll和CSharpDll.dll放在與程序不同目錄的地方,程序中利用了QLibrary指定了CppDll.dll的方式進行加載,而CppDll.dll和CSharpDll.dll,因此程序調(diào)用CppDll.dll里面的函數(shù)時,CppDll.dll會找到與CppDll.dll同一目錄下的CSharpDll.dll,然而CppDll.dll在被程序進行加載時,其繼承了程序的環(huán)境變量,因此會從程序的當前目錄下去查找,所以最好還是將CppDll.dll和CSharpDll.dll放置于程序同一目錄下,同時QLibrary加載當前目錄下的CppDll.dll。當然,部署到另外一臺機器上時,目標機器還是需要安裝.Net Framework,其版本至少不能低于當前CSharpDll.dll所使用的版本。

總結(jié)

到此這篇關于Qt程序中調(diào)用C#編寫的dll的文章就介紹到這了,更多相關Qt 調(diào)用C#編寫的dll內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • C# 泛型類(函數(shù))的實例化小例子

    C# 泛型類(函數(shù))的實例化小例子

    C# 泛型類(函數(shù))的實例化小例子,需要的朋友可以參考一下
    2013-04-04
  • C#實現(xiàn)XOR密碼(異或密碼)的示例代碼

    C#實現(xiàn)XOR密碼(異或密碼)的示例代碼

    XOR密碼(異或密碼)是一種簡單的加密算法,它使用異或(XOR)操作來對明文和密鑰進行加密和解密,本文為大家介紹了C#實現(xiàn)XOR密碼的相關知識,希望對大家有所幫助
    2024-01-01
  • WPF實現(xiàn)炫酷的界面交互效果的代碼詳解

    WPF實現(xiàn)炫酷的界面交互效果的代碼詳解

    在當今競爭激烈的軟件市場中,用戶界面的交互體驗至關重要,一個擁有炫酷動畫特效的應用程序,不僅能吸引用戶的注意力,還能顯著提升用戶與界面的交互流暢度和愉悅感,本文將深入剖析WPF動畫特效的各個方面,通過大量詳細的代碼示例和對關鍵概念的深入解釋
    2025-02-02
  • 詳解C#中的string與String

    詳解C#中的string與String

    本篇文章主要對jC#中的小寫string與大寫String進行詳細介紹,相信對大家學習會有很好的幫助,需要的朋友一起來看下吧
    2016-12-12
  • C#?漢字與拼音互轉(zhuǎn)的實現(xiàn)示例

    C#?漢字與拼音互轉(zhuǎn)的實現(xiàn)示例

    本文主要介紹了C#?漢字與拼音互轉(zhuǎn)的實現(xiàn)示例,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C#語言中字符類char的使用方法(總結(jié))

    C#語言中字符類char的使用方法(總結(jié))

    下面小編就為大家?guī)硪黄狢#語言中字符類char的使用方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • C#啟動進程的幾種常用方法

    C#啟動進程的幾種常用方法

    這篇文章主要介紹了C#啟動進程的幾種常用方法,實例分析了C#對系統(tǒng)進行的相關操作技巧,需要的朋友可以參考下
    2015-05-05
  • C#預處理器指令詳解與示例

    C#預處理器指令詳解與示例

    在軟件開發(fā)中,我們常常需要編寫可移植和可配置的代碼,C#?預處理器指令為我們提供了這樣的能力,在本篇文章中,我們將詳細介紹C#預處理器指令的定義、語法格式、功能以及在實際編程中的應用,需要的朋友可以參考下
    2024-04-04
  • c# 類成員的可訪問性代碼詳解

    c# 類成員的可訪問性代碼詳解

    在本篇文章里小編給大家整理了關于c# 類成員的可訪問性代碼詳解內(nèi)容,有需要的朋友們可以參考下。
    2019-09-09
  • C#中如何執(zhí)行存儲過程方法

    C#中如何執(zhí)行存儲過程方法

    C#中如何執(zhí)行存儲過程方法,需要的朋友可以參考一下
    2013-04-04

最新評論

株洲县| 贵德县| 福州市| 米林县| 措美县| 青龙| 静乐县| 宜春市| 噶尔县| 醴陵市| 吉林省| 山阳县| 永修县| 通道| 镇原县| 清苑县| 万载县| 重庆市| 阿拉善右旗| 安徽省| 新蔡县| 莱西市| 卫辉市| 景谷| 勐海县| 尉犁县| 南城县| 河北区| 仙游县| 青龙| 无锡市| 上栗县| 萝北县| 榆林市| 贞丰县| 丽江市| 大石桥市| 穆棱市| 稷山县| 平远县| 五莲县|