文章目錄
- 1 導出C++ 類函數 、導出 C++函數
- 1.1 .h文件
- 1.2 .cpp 文件
- 1.3 C# 調用
- 2 C++與C#數據類型對應
- 3 保姆級教程(項目搭建、代碼、調用,圖文并茂)
1 導出C++ 類函數 、導出 C++函數
C++ 生成動態庫.dll 詳細教程:
C++ 生成動態庫.dll 及 C++調用DLL,及實際項目中的使用技巧
C++ 生成靜態庫.lib 及 C++調用lib,及實際項目中的使用技巧
1.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//以C方式導出 C++類函數
class MATHTEST_API mathTest
{public:mathTest();int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式導出函數
//extern "C",告訴編譯器這里是C語言代碼//為了使自己建的庫可以在 C/C++ 通用調用,使用 __cplusplus ,
//當C++調用代碼時,__cplusplus 值為1,聲明函數外面就加了一層“extern "C" {}”;
//當C 調用代碼時,__cplusplus 值為0,就相當于沒有“extern "C" {}”;#ifdef __cplusplus
extern "C"
{
#endif//以C方式導出 C++類函數MATHTEST_API mathTest* CreateMyClass();MATHTEST_API void DeleteMyClass(mathTest* obj);MATHTEST_API int Cmultiply(mathTest* obj,int num1, int num2);//加法MATHTEST_API int Cdivide(mathTest* obj, int num1, int num2);//減法//以C方式導出 C++函數MATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//減法
#ifdef __cplusplus
}
#endif#endif
1.2 .cpp 文件
#include "mathTest.h"/*創建動態庫d11:1.VS創建C++ 空項目MyDLL:編寫.h和.cpp文件在.h文件中宏定義導出圖數2.生成dll文件:右鍵項目-->屬性-->配置類型-->動態庫( .dll)以Debug x64 生成解決方案
*//********************************************* 以C方式導出 C++函數********************************************/
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//減法
{return a - b;
}/********************************************* 以C方式導出 C++類函數********************************************/// 已導出類的構造函數。
mathTest::mathTest()
{return;
}int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}MATHTEST_API mathTest* CreateMyClass()
{return new mathTest();
}MATHTEST_API void DeleteMyClass(mathTest* obj)
{delete obj;
}
MATHTEST_API int Cmultiply(mathTest* obj, int num1, int num2)//加法
{return obj->multiply(num1,num2);
}
MATHTEST_API int Cdivide(mathTest* obj, int num1, int num2)//減法
{return obj->divide(num1,num2);
}
1.3 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.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace test
{public partial class Form1 : Form{//extern C ,以C方式導出 C++函數[DllImport("dllTest.dll")]static extern int Cadd(int a, int b);[DllImport("dllTest.dll")]static extern int Csubtract(int a, int b);//extern C ,以C方式導出 C++函數private static IntPtr myClassInstance; // 定義C++類的實例,用于后面的調用[DllImport("dllTest.dll", CallingConvention = CallingConvention.Cdecl)]private static extern IntPtr CreateMyClass();[DllImport("dllTest.dll", CallingConvention = CallingConvention.Cdecl)]private static extern void DeleteMyClass(IntPtr obj);[DllImport("dllTest.dll", CallingConvention = CallingConvention.Cdecl)]private static extern int Cmultiply(IntPtr obj, int num1, int num2);//加法[DllImport("dllTest.dll", CallingConvention = CallingConvention.Cdecl)]private static extern int Cdivide(IntPtr obj, int num1, int num2);//減法public Form1(){InitializeComponent();}private void button3_Click(object sender, EventArgs e){//以C方式導出 C++函數int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);string str0 = "動態庫測試 dllTest.dll-- 導出 C++函數:";string str1 = "10 + 5 = " + Csum.ToString();string str2 = "10 - 5 = " + Csub.ToString();listBox1.Items.Add(str0);listBox1.Items.Add(str1);listBox1.Items.Add(str2);//以C方式導出 C++ 類函數myClassInstance = CreateMyClass();int Cmul = Cmultiply(myClassInstance, 10, 5);int Cdiv = Cdivide(myClassInstance, 10, 5);str0 = "動態庫測試 dllTest.dll--導出 C++ 類函數:";str1 = "10 x 5 = " + Cmul.ToString();str2 = "10 ÷ 5 = " + Cdiv.ToString();listBox1.Items.Add(str0);listBox1.Items.Add(str1);listBox1.Items.Add(str2);// 清理C++內存DeleteMyClass(myClassInstance);}}
}
2 C++與C#數據類型對應
C#在調用C++ DLL時,需要通過P/Invoke技術來完成。P/Invoke是.NET Framework用于調用非托管代碼庫的一種方式。在這個過程中,我們需要處理兩種語言之間的數據類型轉換,因為它們的數據類型不完全一致。
基本數據類型對應表
以下是C++和C#之間的一些常見數據類型的對應表(請注意,這并不是一個完全的列表,只是一些常見類型的示例):
3 保姆級教程(項目搭建、代碼、調用,圖文并茂)
保姆級教程,從C++ 生成動態庫.dll 到 C#調用C/C++生成動態庫.dll,每一個步驟都非常詳細的截圖、注釋、說明,附原碼;
保姆級教程連接:C#調用C/C++生成動態庫.dll及C++ 生成動態庫.dll ,DllImport()方式導入 C++動態庫.dll方法總結
項目下載 :同一個解決方案下多個項目:C++生成動態庫項目和C#調用項目