【10】C#实战篇——C# 调用 C++ dll(C++ 导出函数、C++导出类)
文章目录
- 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#调用项目