【45】C#入門到精通——C#調用C/C++生成動態庫.dll及C++ 生成動態庫.dll ,DllImport()方式導入 C++動態庫.dll方法總結

文章目錄

  • 1 C++ 生成動態庫.dll
  • 2 C#調用C/C++生成動態庫.dll
    • 2.1 [DllImport()] 方式導入 C++動態庫.dll
    • 2.2 調用測試
  • 3 C/C++ 生成通用dll,改進
    • 3.1改進后.h
    • 3.2 .cpp
    • 3.2 C# 調用
  • 4 [DllImport()] 方式導入C++生成的 .dll 總結
    • 4.1 指定路徑導入
    • 4.2 .dll放在 執行目錄下(一定要放對)

C#動態調用DLL文件(有的DLL是用C++或其它語言寫的不能直接調用,但可以用態調用)
C#【必備技能篇】VS2019 使用C/C++ 生成DLL 文件,并用 C/C++、C#調用DLL

1 C++ 生成動態庫.dll

C++ 生成動態庫.dll 詳細教程:C++ 生成動態庫.dll 及 C++調用DLL,C++ 生成靜態庫.lib及 C++調用lib

教程中如圖,聲明了三種類型的函數;

  • 導出函數
  • 導出類函數
  • 以C方式導出函數 注: 只有這種方式才可被 C#調用

下面就用C# 試圖調用這三種類型的函數:

在這里插入圖片描述

2 C#調用C/C++生成動態庫.dll

新建 C# windows窗體應用(.NET Framework)項目
在這里插入圖片描述

試圖通過 引用的方式 引用C/C++生成動態庫.dll報錯,因為這種方式只能 引用C#生成的動態庫dll

在這里插入圖片描述

在這里插入圖片描述

2.1 [DllImport()] 方式導入 C++動態庫.dll

建好 windows窗體應用(.NET Framework)項目后,

找到項目中Form1.cs雙擊彈出 類似于 MFC的窗口,在右側拖一個button,

在這里插入圖片描述

在這里插入圖片描述
雙擊進入button函數,寫調用 C++動態庫.dll中函數的實現代碼

  • 在button函數外面先導入,C/C++動態庫.dll中的函數名
//導入函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int add(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll", EntryPoint = "subtract")]static extern int subtract(int a, int b);//導入類函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll", EntryPoint = "multiply")]static extern int multiply(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int divide(int a, int b);//extern C ,以C方式導入函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int Cadd(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int Csubtract(int a, int b);

2.2 調用測試

在button 函數中,調用函數

        private void button1_Click(object sender, EventArgs e){//調用函數//int sum = add(10,5);int sub = subtract(10,5);int mul = multiply(10,5); int div = divide(10, 5); int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);//顯示函數計算結果//MessageBox.Show("導入函數" + sum.ToString());//MessageBox.Show("導入函數" + sub.ToString());//MessageBox.Show("導入類函數" + mul.ToString());//MessageBox.Show("導入類函數" + div.ToString());MessageBox.Show("extern C ,以C方式導入函數" + Csum.ToString());MessageBox.Show("extern C ,以C方式導入函數" + Csub.ToString());}

完整代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace CdllTest2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//導入函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int add(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll", EntryPoint = "subtract")]static extern int subtract(int a, int b);//導入類函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll", EntryPoint = "multiply")]static extern int multiply(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int divide(int a, int b);//extern C ,以C方式導入函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int Cadd(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int Csubtract(int a, int b);private void button1_Click(object sender, EventArgs e){//調用函數//int sum = add(10,5);int sub = subtract(10,5);int mul = multiply(10,5); int div = divide(10, 5); int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);//顯示函數計算結果//MessageBox.Show("導入函數" + sum.ToString());//MessageBox.Show("導入函數" + sub.ToString());//MessageBox.Show("導入類函數" + mul.ToString());//MessageBox.Show("導入類函數" + div.ToString());MessageBox.Show("extern C ,以C方式導入函數" + Csum.ToString());MessageBox.Show("extern C ,以C方式導入函數" + Csub.ToString());}}
}

在這里插入圖片描述

點擊button后,運行報錯 ,找不到函數入口點;
在這里插入圖片描述

導出函數 、 導出類函數 都會報錯無法在。。。。找到。。函數的入口點

在這里插入圖片描述

extern C ,以C方式導入函數
調用結果 如下

 int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);

在這里插入圖片描述

3 C/C++ 生成通用dll,改進

為了使自己建的 C/C++ 庫可 都可以被C#調用

使用 __cplusplus

  • 當C++代碼時,__cplusplus 值為1;
  • 當C 代碼時,__cplusplus 值為0;
#ifdef __cplusplus 
.
.
.
#endif

3.1改進后.h

//#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定義導出:
#ifndef MATHTEST_ //如果沒有定義 MATHTEST_,就定義MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //導出
#else
#define MATHTEST_API __declspec(dllimport) //導入
#endif//動態鏈接MATHTEST_API庫//以C語言的方式導出函數
//extern "C",告訴編譯器這里是C語言代碼#ifdef __cplusplus 
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);     //加法MATHTEST_API int Csubtract(int a, int b);//減法MATHTEST_API int Cmultiply(int a, int b); //乘法MATHTEST_API int Cdivide(int a, int b);   //除法#ifdef __cplusplus
}
#endif#endif

當C++ 代碼時,__cplusplus 值為1,那么源代碼對應部分 等價于

extern "C"
{MATHTEST_API int Cadd(int a, int b);     //加法MATHTEST_API int Csubtract(int a, int b);//減法MATHTEST_API int Cmultiply(int a, int b); //乘法MATHTEST_API int Cdivide(int a, int b);   //除法
}
#endif

當C 代碼時,__cplusplus 值為0,那么源代碼 對應部分 等價于;
#ifdef __cplusplus#endif 部分是沒有執行的

	MATHTEST_API int Cadd(int a, int b);     //加法MATHTEST_API int Csubtract(int a, int b);//減法MATHTEST_API int Cmultiply(int a, int b); //乘法MATHTEST_API int Cdivide(int a, int b);   //除法

3.2 .cpp

#include "mathTest.h"//加法
int Cadd(int a, int b)
{return a + b;
}//減法
int Csubtract(int a, int b)
{return a - b;
}//乘法
int Cmultiply(int a, int b)
{return a * b;
}//除法
int Cdivide(int a, int b)
{return a / b;
}

3.2 C# 調用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace CdllTest2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//extern C ,以C方式導入函數[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int Cadd(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll", EntryPoint = "Csubtract")]static extern int Csubtract(int a, int b);//EntryPoint關鍵詞,要不要都行[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll", EntryPoint = "Cmultiply")]static extern int Cmultiply(int a, int b);[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]static extern int Cdivide(int a, int b);private void button1_Click(object sender, EventArgs e){//調用函數int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);int Cmul = Cmultiply(10, 5);int Cdiv = Cdivide(10, 5);//顯示函數計算結果MessageBox.Show("extern C ,以C方式導入函數\n" + "\nCsum = " + Csum.ToString()+ "\nCsub = " + Csub.ToString()+ "\nCmul = " + Cmul.ToString()+ "\nCdiv = " + Cdiv.ToString());}}
}

在這里插入圖片描述

4 [DllImport()] 方式導入C++生成的 .dll 總結

4.1 指定路徑導入

[DllImport(@"E:\C#\CdllTest2\CdllTest2\bin\Debug\Dll1.dll")]
static extern int Cadd(int a, int b);

4.2 .dll放在 執行目錄下(一定要放對)

.dll放在 執行目錄下bin下面的 Debug或Release下面

[DllImport("Dll1.dll")]
static extern int Cadd(int a, int b);

在這里插入圖片描述

注意,有4種情況:
如果是 Debug X64,那么 .dll就放在 \bin\x64\Debug下面
如果是 Release X64,那么 .dll就放在 \bin\x64\Release下面

如果是 Debug Any CPU,那么 .dll就放在 \bin\Debug 下面
如果是 Release Any CPU,那么 .dll就放在 \bin\Release 下面
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93995.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93995.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93995.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從協議棧到ath12k_mac_op_tx的完整調用路徑

文章目錄 從協議棧到ath12k_mac_op_tx的完整調用路徑 1. 整體架構概覽 2. 詳細調用路徑分析 2.1 應用層到Socket層 2.2 協議層處理 2.3 網絡設備層到mac80211 2.4 mac80211發送入口 2.5 mac80211核心發送處理 2.6 mac80211發送核心處理 2.7 mac80211發送調度 2.8 最終驅動調用 …

WPFC#超市管理系統(4)入庫管理

入庫管理7. 商品入庫管理7.2 入庫實現顯示名稱、圖片、單位7.3 界面設計7.3 功能實現7. 商品入庫管理 數據庫中StockRecord表需要增加商品出入庫Type類型為nvarchar(50)。C#中的數據庫重新同步StockRecord表在Entity→Model中新建枚舉類型StockType namespace 超市管理系統.E…

CSS 打字特效

效果圖.wxml <view class"tips"><text>{{ tipsText }}</text><text class"tips-line">|</text> </view>.wxss .tips{padding: 50rpx 100rpx;font-size: 28rpx; } .tips-line{color: #ccc;animation: tips-line .5s al…

直播小程序 app 系統架構分析

一、引言 直播行業近年來發展迅猛&#xff0c;直播小程序和 APP 成為眾多用戶獲取直播內容以及主播進行內容輸出的重要平臺。一個完善且高效的系統架構是支撐直播業務穩定運行、提供優質用戶體驗的關鍵。本文將詳細剖析直播小程序 / APP 的系統架構&#xff0c;包括整體架構設計…

Vue常見題目

1. 什么是 Vue.js&#xff1f;它的核心特點是什么&#xff1f; Vue.js 是一個漸進式 JavaScript 框架&#xff0c;用于構建用戶界面。它的核心特點包括&#xff1a; - 響應式數據綁定 - 組件化開發 - 虛擬 DOM - 指令系統 - 輕量級且易于集成 - 豐富的生態系統&#xff08;Vue…

ipynb文件直接發布csdn

第一步&#xff0c;下載markdown文件 file --> save and export notebook as --> markdown第二步&#xff0c;導入markdown文件 進入csdn發布文章界面&#xff0c;點擊導入&#xff0c;選擇第一步下載的markdown文件即可

廣東省省考備考(第六十四天8.2)——判斷推理(重點回顧)

判斷推理&#xff1a;數量規律 錯題解析解析解析解析解析解析解析標記題解析解析解析解析解析解析解析今日題目正確率&#xff1a;53% 判斷推理&#xff1a;屬性規律 錯題解析解析解析解析解析解析標記題解析解析今日題目正確率&#xff1a;60%

【C++/STL】vector的OJ,深度剖析和模擬實現

vector在OJ中的使用 1.只出現一次的數字 class Solution { public:int singleNumber(vector<int>& nums) {int value 0;for(auto e : v) {value ^ e; }return value;} };2.楊輝三角 class Solution { public:vector<vector<int>> generate(int numRow…

衡石湖倉一體架構深度解構:統一元數據層如何破除數據孤島?

一、數據融合的世紀難題典型困境二、衡石統一元數據層設計架構核心關鍵技術實現智能元數據發現自動構建跨源血緣關系動態查詢重寫 將標準SQL翻譯為最優執行計劃text Original: SELECT SUM(sales) FROM virtual_view Rewritten: [S3] SELECT SUM(amount) FROM crm_sales [My…

Windows 下 fping 指令使用指南

fping 作為一款強大的網絡工具&#xff0c;能夠同時向多個主機發送 ICMP 回聲請求&#xff0c;相較于傳統的 ping 命令&#xff0c;在處理大量主機時具有顯著優勢。 一、fping 簡介? fping 是 “fast pinger” 的縮寫&#xff0c;它可以向一系列 IP 地址發送 ICMP 回聲請求。…

代碼隨想錄day52圖論3

文章目錄101. 孤島的總面積102. 沉沒孤島103. 水流問題104.建造最大島嶼101. 孤島的總面積 題目鏈接 文章講解 #include<bits/stdc.h> using namespace std;int ans 0; // 記錄不與邊界相連的孤島數量 int sum 0; // 當前孤島的面積 bool flag false; /…

linux pip/conda 修改默認cache位置

1 pip pip cache默認在/home/{username}目錄下&#xff0c;容易導致系統盤寫滿報錯。查看pip cache位置pip cache dir假設移動pip cache目錄到 /data/.cache/pip/cache&#xff0c;命令如下pip config set global.cache-dir /data/.cache/pip/cache2 conda 查看conda緩存位置c…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘seaborn’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘seaborn’問題 一、摘要 在使用 PyCharm 終端進行模塊安裝時&#xff0c;常常會遇到如下異常&#xff1a; ModuleNotFoundError: No module named ‘seaborn’…

(思維)洛谷 P13551 ももいろの鍵 題解

題意 愛莉給了你一個非負整數 nnn&#xff0c;你需要把 0,1,2,…,n0, 1, 2, \dots, n0,1,2,…,n 劃分成若干組&#xff0c;滿足每一組的按位與為 000。 劃分的組不需要相鄰。 你需要最大化劃分組數并給出方案。 1≤T≤6001 \le T \le 6001≤T≤600&#xff0c;0≤n≤1050 \le n…

記錄一次ESP32報錯Guru Meditation Error: Core 1 panic‘ed (Double exception).

一、問題描述 需求&#xff1a; ESP32S3單片機&#xff0c;連接一個麥克風讀取5s后&#xff0c;編碼后發送到百度云進行語音識別。通過freertos框架&#xff0c;將任務放在核1中運行&#xff08;放在核0同樣報錯&#xff09; 問題&#xff1a; 在最后的發送語音數據中&#xff…

半導體物理復習

半導體物理導論第一章 半導體的電子狀態

vi/vim跳轉到指定行命令

在 vi/vim 中跳轉到指定行有多種高效方法&#xff0c;以下是最常用的操作方式&#xff1a; 一、基礎跳轉&#xff1a;行號 命令命令模式下直接輸入行號 按 Esc 切換到命令模式后&#xff0c;輸入 :行號 并回車。例如&#xff0c;輸入 :100 會直接跳轉到第 100 行。使用 G 快捷…

智能落地扇方案:青稞RISC-V電機 MCU一覽

在科技飛速發展的今天&#xff0c;智能家居已成為人們生活中不可或缺的一部分&#xff0c;而風扇作為夏日解暑的必備家電&#xff0c;其智能化升級也成為了行業發展的必然趨勢。傳統落地扇功能單一、操作不便&#xff0c;已難以滿足現代消費者對便捷、舒適、節能生活的追求。在…

SQL 中 WHERE 與 HAVING 的用法詳解:分組聚合場景下的混用指南

SQL中WHERE與HAVING的用法詳解&#xff1a;分組聚合場景下的混用指南 1. WHERE與HAVING的基本區別 在SQL查詢中&#xff0c;WHERE和HAVING都是用于過濾數據的子句&#xff0c;但它們的應用時機和作用對象有本質區別&#xff1a; WHERE子句&#xff1a;在分組前對原始數據進行過…

14 - 大語言模型 — 抽取式問答系統 “成長記”:靠 BERT 學本事,從文本里精準 “揪” 答案的全過程(呆瓜版-1號)

目錄 1、什么是問答系統&#xff1f; 2、問答系統的核心工作流程 2.1、理解問題&#xff1a;把問題 “翻譯” 成機器能懂的形式 2.2、 尋找答案&#xff1a;從信息中定位答案 2.3、生成答案&#xff1a;整理并輸出結果 2.4、優化迭代&#xff1a;讓系統更 “聰明” 3、主…