C# 调用 c++ dll

C# 调用 c++ dll

首先 c++ 库 dll 要定义

  • 代码中定义 CPP_EXPORTS
#ifdef LASERSDK_EXPORTS
#define CPP_EXPORTS __declspec(dllexport)
#else
#define CPP_EXPORTS __declspec(dllimport)
#endif
  • 编译器定义

LASERSDK_EXPORTS
在这里插入图片描述

普通函数

  • c++
extern "C" CPP_EXPORTS int __stdcall Add(int n1, int n2);int __stdcall Add(int n1, int n2)
{return n1 + n2;
}
  • c#

[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int Add(int n1, int n2);// 使用
int res = Add(1, 1);

结构体

  • c++
struct Vector4
{float A, B, C;const char* D = nullptr;
};extern "C" CPP_EXPORTS Vector4 __stdcall Add2(int n1, int n2);
extern "C" __declspec(dllexport) void __stdcall Add5(Vector4 vec);// 结构体指针  
// c++ 开启的内存,c++ 回收  Add7_Clear
extern "C" __declspec(dllexport) Vector4* __stdcall Add7();
extern "C" __declspec(dllexport) void __stdcall Add7_Clear(Vector4* vc);// cpp
Vector4 __stdcall Add2(int n1, int n2)
{Vector4 sd;sd.A = 12;sd.B = 13;sd.D = "asdfssssws";return sd;
}void __stdcall Add5(Vector4 vec)
{printf("\n Add5:: \n");printf("%f ,", vec.A);printf("%s ,", vec.D);printf("\n");
}Vector4* __stdcall Add7()
{Vector4* vec = new Vector4();vec->A = 1212;vec->D = new char[10000];return vec;
}void __stdcall Add7_Clear(Vector4* vc)
{if (vc){if (vc->D){delete vc->D;}delete vc;}
}
  • c#
[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern Vector4 Add2(int n1, int n2);[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void Add5(Vector4 vec);[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr Add7();
[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void Add7_Clear(IntPtr vc);// 使用
Vector4 sd = Add2(1, 1);
string s = Marshal.PtrToStringAnsi(sd.D);
Console.WriteLine("asdfasdfasdf : " + s);Vector4 _vec = new Vector4();
_vec.A = 123;
_vec.D = Marshal.StringToHGlobalAnsi("dddddddddsdsdsdsdsbsbsbsbsbsbsb");Add5(_vec);
Marshal.FreeHGlobal(_vec.D);IntPtr add7 = Add7();Vector4 _vec7 = (Vector4)Marshal.PtrToStructure(add7, typeof(Vector4));
Console.WriteLine(_vec7.A);Add7_Clear(add7);

数组

  • c++
extern "C" CPP_EXPORTS int __stdcall arraytest(float* vals, int len);int __stdcall arraytest(float* vals, int len)
{for (int i = 0; i < len; i++){vals[i] = i;}return 0;
}
  • c#

[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int arraytest( float[] datas,int len);// usefloat[] one_outlines = new float[1024];
int res = arraytest(one_outlines, 1024);

回调函数

  • c++
typedef void (*callback_outline)(int, float*, int);
extern "C" CPP_EXPORTS void __stdcall laser_set_callback_outline_handle(callback_outline cb);callback_outline _callback_outline;
float vals[1024];void __stdcall laser_set_callback_outline_handle(callback_outline cb)
{_callback_outline = cb;printf("laser_set_callback_outline_handle suc \n");if (_callback_outline){_callback_outline(1, vals, 1024);}
}
  • c#
// 映射c++函数
[DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void laser_set_callback_outline_handle(CallbackOutlineDelegate call);// 创建委托
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallbackOutlineDelegate(int handle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1024)] float[] ydata, int len);// use// 回调函数
public static void CallbackOutlineFunc(int handle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1024)] float[] ydata, int len)
{}static LaserSdk.CallbackOutlineDelegate outlineDelegate;
static void Main1(string[] args)
{outlineDelegate = new LaserSdk.CallbackOutlineDelegate(CallbackOutlineFunc);laser_set_callback_outline_handle(outlineDelegate);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ucharts中,当数据为0时,不显示

当为0时&#xff0c;会显示出来&#xff0c;值比较小的时候&#xff0c;数据会显示在一起&#xff0c;不美观 期望效果&#xff1a; 实现步骤&#xff1a; 我是将uCharts插件下载导入到src/uni_modules下的 1、修改src/uni_modules/qiun-data-charts/js_sdk/u-charts/confi…

【漏洞复现】OpenTSDB 2.4.0 命令注入(CVE-2020-35476)漏洞复现

漏洞描述 官方文档这样描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written ontop of HBase; 翻译过来就是,基于Hbase的分布式的,可伸缩的时间序列数据库。 主要用途,就是做监控系统;譬如收集大规模集群(包括网络设备、操作系统、应用程序…

有趣的代码——猜数字游戏的实现

前面介绍过很多的C语言常识&#xff0c;但是我们都知道“兴趣是最好的老师”&#xff0c;所以&#xff0c;今天我们用之前讲过的一些知识&#xff0c;加上部分新补充的知识点&#xff0c;写一个“猜数字”的小游戏&#xff0c;来丰富我们的编程学习生活&#xff0c;感受来自C语…

Java高级技术(反射:获取类的构造器)

一&#xff0c;常用方法 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;获取全部构造器 &#xff08;2&#xff09;&#xff0c;获取某个构造器 &#xff08;3&#xff09;&#xff0c;实验类 三&#xff0c; 初始化对象 四&#xff0c;案例

【数据结构】——堆排序

前言&#xff1a;我们已经学习了堆以及实现了堆&#xff0c;那么我们就来给堆进行排序。我们怎么来进行排序呢&#xff1f;这一次我们就来解决这个问题。 如果我们堆排序要求排序&#xff0c;我们是建立大堆还是小堆呢&#xff0c;如果我们建的小堆的话&#xff0c;那我们在排序…

js小技巧|如何提取经过Function函数混淆了的代码

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1.需求 星友发过来一个混淆代码&#xff0c;打开一看&#xff0c;长这…

“前端已死”?从ChatGPT与低代码平台看未来编程之路

每隔一段时间&#xff0c;“前端已死”的论调就会如潮水般重新涌现&#xff0c;引发行业内外的热议。这种论调背后&#xff0c;除了对于新技术&#xff0c;如ChatGPT、GPT-4对前端开发者影响的担忧&#xff0c;还反映了人们对于技术变革的焦虑。 作为前端开发者&#xff0c;我坚…

查理·芒格留给我们的 84 条名言

你好&#xff0c;我是 EarlGrey&#xff0c;喜欢翻译点东西&#xff0c;偶尔写写代码。 点击下方卡片关注我&#xff0c;一起向上进击&#xff0c;提升自我。后台回复关键词“电子书”&#xff0c;送你一份我收藏的电子书合集。 *** 查理芒格&#xff08;Charlie Munger&#x…

@RequestMapping

目录 作用&#xff1a; 位置&#xff1a; 属性 1.value 2.method 3.params 4.header 作用&#xff1a; 该注解是一个用来处理请求地址映射的注解。 位置&#xff1a; 可用于映射一个请求或一个方法&#xff0c;可以用在类或方法上。 用于方法上&#xff0c;表示在类的…

检验科LIS系统源码,LIS系统,检验数据分析,生成检验报告

检验科LIS系统源码&#xff0c;全套LIS系统商业项目源码 LIS是HIS系统的一个重要的组成部分&#xff0c;其主要功能是将检验的实验仪器传出的检验数据经分析&#xff0c;生成检验报告&#xff0c;通过网络存储在数据库中&#xff0c;这样医生能够方便、及时的看到患者的检验结果…

第22章 NIO编程

在本章中需要掌握NIO中的缓冲区的作用&#xff0c;并理解缓冲区中的数据处理模型&#xff0c;掌握Channel的作用&#xff0c;并结合缓冲区实现数据I/O操作&#xff0c;理解文件锁的作用&#xff0c;并且掌握字符编码处理支持类的使用&#xff0c;掌握Reactor设计模型&#xff0…

CSS特效021:蛇形左右扭动的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

新手老师如何管理班级的日常工作

作为一名新手老师&#xff0c;管理班级的日常工作可能会是一项挑战&#xff0c;但以下是一些可能有用的建议&#xff1a; 建立良好的班级文化 班级文化是班级氛围的重要组成部分&#xff0c;对于学生的学习和成长具有重要影响。作为老师&#xff0c;要积极营造一种积极向上、团…

电脑IP地址怎么修改?http代理ip设置方法有哪些?

在互联网时代&#xff0c;我们的网络已经成为我们生活、工作和学习中不可或缺的一部分。有时候&#xff0c;为了保护我们的隐私或者突破网络限制&#xff0c;我们需要修改电脑的IP地址。那么&#xff0c;电脑IP地址怎么修改呢&#xff1f;http代理ip设置方法有哪些呢&#xff1…

怎么检测电脑电源?电脑电源检测系统软件如何助力?

电源是电脑的重要组成部分&#xff0c;为电脑提供稳定电源&#xff0c;保证电脑正常工作。但是在电脑实际使用过程中总会遇到各种各样的问题和故障&#xff0c;比如无法开机&#xff0c;因此电脑电源检测是非常重要的测试内容。 如何测试电脑电源? 1. 用万用表检测 a. 将万用表…

linux命令解析神器

遥想刚迈入职场时&#xff08;当时的工作环境&#xff0c;需要频繁使用linux&#xff0c;登录设备后台操作&#xff09;&#xff0c;偶然间听到我的领导和其他同事说 &#xff1a;“XXX&#xff0c;多学一学。大佬们太厉害了&#xff0c;太低级的问题不要直接问&#xff0c;你登…

HarmonyOS将程序下载并运行到真机上 (华为手机为例)

前面的文章 我们讲到过一些关于这个预览器的操作 可以在上面看到我们代码的一个整体效果 但其实 这边可以真实的运行在我们自己的手机上 因为你这个预览器再好 还是和实际的手机环境有所偏差 首先 我们要设置一下手机 我们在设置中 找到 关于手机 然后 这下面 有一个 Harmo…

Redis学习文档

目录 一、概念1、特征2、关系型数据库和非关系型数据库的区别3、键的结构4、Redis的Java客户端5、缓存更新策略5.1、概念5.2、代码 6、缓存穿透6.1、含义6.2、解决办法6.3、缓存空值代码举例6.4、布隆过滤器代码举例 7、缓存击穿7.1、概念7.2、解决办法7.3、互斥锁代码举例7.4、…

[PyTorch][chapter 2][李宏毅深度学习-Regression]

前言&#xff1a; Regression 模型主要用于股票预测,自动驾驶,推荐系统等领域. 这个模型的输出是一个scalar。这里主要以下一个线性模型为基础 它是神经网络的基础模块&#xff0c; 目录&#xff1a; 总体流程 常见问题 Numpy 例子 PyTorch 例子 一 总体流程 1 : 建…

智慧工地解决方案,Spring Cloud智慧工地项目平台源码

智慧工地一体化信息管理平台源码&#xff0c;微服务架构JavaSpring Cloud UniApp MySql 智慧工地云平台是专为建筑施工领域所打造的一体化信息管理平台。通过大数据、云计算、人工智能、物联网和移动互联网等高科技技术手段&#xff0c;将施工区域各系统数据汇总&#xff0c;建…