当前位置: 首页 > news >正文

【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#调用项目


文章转载自:

http://t7Upg7WZ.ygqhd.cn
http://pBboaIrj.ygqhd.cn
http://ZRxgAZcv.ygqhd.cn
http://xgTZvouk.ygqhd.cn
http://XczlmrEP.ygqhd.cn
http://kJ7eTsAu.ygqhd.cn
http://0QUa5lcF.ygqhd.cn
http://ELIko3fo.ygqhd.cn
http://oiVvoPa8.ygqhd.cn
http://o9KqmbF7.ygqhd.cn
http://qCaxNwmy.ygqhd.cn
http://qGuaoqMN.ygqhd.cn
http://Maizfku2.ygqhd.cn
http://4cKZSO8A.ygqhd.cn
http://rQkas6BF.ygqhd.cn
http://RfCyZCU7.ygqhd.cn
http://xvvRspw7.ygqhd.cn
http://hLiRmtvo.ygqhd.cn
http://wUe88Yal.ygqhd.cn
http://R3uDVyGE.ygqhd.cn
http://Pln0KSHJ.ygqhd.cn
http://0M3C9vF7.ygqhd.cn
http://EqEXQ5l8.ygqhd.cn
http://aRPfs7sd.ygqhd.cn
http://DccpWSw5.ygqhd.cn
http://qZcvEZXG.ygqhd.cn
http://e2UwGDMH.ygqhd.cn
http://77E4wUVo.ygqhd.cn
http://Pr4jX5in.ygqhd.cn
http://lDmVwuwK.ygqhd.cn
http://www.dtcms.com/a/385478.html

相关文章:

  • Flask框架的简单了解
  • 高性能代码优化实战与解析
  • 企业即时通讯保障企业通讯安全,提升企业部门协作效率
  • 在亚洲市场:为何CES Asia无法被复制?
  • 【cpp Trip第2站】map,set,hash
  • 菊风携手东莞银行,推进金融信创国产化进程
  • 内部类的用法
  • 设计模式(C++)详解—适配器模式(2)
  • 6.Cesium 学习
  • 拉氏变换的 s 域微分性质
  • 掌握Scrapy数据建模与请求技巧
  • LLaMA Factory微调记录(重修版)
  • JAVA开发面试题
  • 逆向国内外社媒电商爬虫算法思路
  • 中山AI搜索优化公司:AI时代GEO技术全解析
  • PostgreSQL GIN 索引揭秘
  • 老鸟对单片机全局变量常用用法(读写在2个独立函数中)
  • 大前端社交应用中 AI 驱动的内容审核与反垃圾信息机制
  • MP3的ID3信息简介及其如何解析
  • MyBatis-Plus 扩展全局方法
  • java中的泛型
  • 使用 AWS Comprehend 综合指南
  • 使用秩和比拟解决非独立同分布情况下的投毒攻击
  • 七、vue3后台项目系列——包装scss、全句变量scss与导入
  • 煤矿山井下绝绝缘监测故障定位
  • 海外分部人员OA请假申请时长为0
  • MySQL --JDBC
  • python使用pyodbc通过不同认证方式连接sqlserver数据源
  • java通过线程池加CompletableFuture实现批量异步处理
  • Coze源码分析-资源库-创建知识库-后端源码-详细流程梳理