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.rhkb.cn/news/205630.html

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

相关文章

数据挖掘 感知机

要使用感知机&#xff0c;我们首先要引入头文件&#xff0c;以下是感知机用的到头文件&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Perceptron from sklearn.model_selection import train_test_…

Ubuntu Linux玩童年小霸王插卡游戏

1.下载安装模拟器 在Windows平台模拟器非常多&#xff0c;而且效果也很优秀&#xff0c;Linux平台的用户常常很羡慕&#xff0c;却因为系统的缘故&#xff0c;无法使用这样的模拟器&#xff0c;但是随着时代的发展&#xff0c;Linux平台也出现了许多优秀的模拟器&#xff0c;现…

深度学习框架:Pytorch与Keras的区别与使用方法

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 Pytorch与Keras介绍 Pytorch 模型定义 模型编译 模型训练 输入格式 完整代码 Keras 模型定义 模型编译 模型训练 输入格式 完整代…

4G5G防爆执法记录仪、防爆智能安全帽赋能智慧燃气,可视化巡检巡线,安全生产管控

随着燃气使用的普及&#xff0c;燃气安全问题日益突出。传统应急安全问题处理方式暴露出以下问题&#xff1a; 应急预案不完善&#xff1a;目前一些燃气企业的应急预案存在实用性不高、流程不清晰等问题&#xff0c;导致在紧急情况下难以迅速启动和有效执行。 部门协同不流畅…

Less的函数的介绍

文章目录 前言描述style.less输出后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;…

数据仓库数据管理模型

数据仓库分为贴源层、数据仓库层、数据服务层&#xff0c;有人叫做数仓数据模型&#xff0c;或者叫"数据管理模型”。 我们为什么要进行数据分层管理&#xff0c;下图的优点介绍已经说得比较明确&#xff0c;再补充几点&#xff1a; 保障数据一致性&#xff1a;上层的数…

C#图像处理OpenCV开发指南(CVStar,03)——基于.NET 6的图像处理桌面程序开发实践第一步

1 Visual Studio 2022 开发基于.NET 6的OpenCV桌面程序 1.1 为什么选择.NET 6开发桌面应用&#xff1f; 选择 .NET 6&#xff08;最早称为 .NET Core&#xff09;而非 Frameworks.NET 的理由是&#xff1a;&#xff08;1&#xff09;跨平台&#xff1b;已经支持Windows,Linux…

Redis 事件轮询

1 Redis 为什么快 数据存在内存中, 直接操作内存中的数据单线程处理业务请求避免了多线的上下文切换, 锁竞争等弊端使用 IO 多路复用支撑更高的网络请求使用事件驱动模型, 通过事件通知模式, 减少不必要的等待… 这些都是 Redis 快的原因。 但是这些到了代码层面是如何实现的呢…

【UGUI】中Content Size Fitter)组件-使 UI 元素适应其内容的大小

官方文档&#xff1a;使 UI 元素适应其内容的大小 - Unity 手册 必备组件&#xff1a;Content Size Fitter 通常&#xff0c;在使用矩形变换定位 UI 元素时&#xff0c;应手动指定其位置和大小&#xff08;可选择性地包括使用父矩形变换进行拉伸的行为&#xff09;。 但是&a…

PHP项目用docker一键部署

公司新项目依赖较多&#xff0c;扩展版本参差不一&#xff0c;搭建环境复杂缓慢&#xff0c;所以搭建了一键部署的功能。 docker-compose build 构建docker docker-compose up 更新docker docker-compose up -d 后台运行docker docker exec -it docker-php-1 /bin/bas…

idea方法注释模版设置

方法上面的注释模版&#xff1a; Template text: ** Description $desc$ $param$ $return$* Aauthor yimeng* date $DATE$ $TIME$ **/param&#xff1a; groovyScript("def result ;def params \"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toLis…

.net core 连接数据库,通过数据库生成Modell

1、安装EF Core Power Tools&#xff1a;打开Vs开发工具→扩展→管理扩展 2、(切记执行这步之前确保自己的代码不存在编写或者编译错误&#xff01;)安装完成后在你需要创建数据库实体的项目文件夹上面单击右键&#xff0c;找到EF Core 工具&#xff08;必须安装扩展之和才会有…

redis的集群,主从复制,哨兵

redis的高可用 在Redis中&#xff0c;实现高可用的技术主要包括持久化、主从复制、哨兵和集群&#xff0c;下面分别说明它们的作用&#xff0c;以及解决了什么样的问题。 持久化&#xff1a; 持久化是最简单的高可用方法&#xff08;有时甚至不被归为高可用的手段&#xff09;…

手机笔记工具怎么加密?

选择用手机笔记工具记事&#xff0c;大家可以记录很多学习笔记、读书笔记、私密日记等&#xff0c;手机作为随身携带的设备&#xff0c;记录相关的笔记比较快捷且方便&#xff0c;当手机笔记中记录的内容比较私密时&#xff0c;大家担心手机笔记会被别人误看&#xff0c;这时候…

面试篇Flink

一&#xff1a;为什么学习flink&#xff1f; 相比较spark&#xff0c;flink对于实时这块&#xff0c;使用过流的方式进行实现。 spark是通过批流的方式实现&#xff0c;通过减少批的时间间隔来实现流的功能。 二&#xff1a;什么是flink&#xff1f; flink是一个针对于实时进…

C++ 通过CryptoPP计算Hash值

Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目&#xff0c;提供了大量的密码学算法和功能&#xff0c;包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具&#xff0c;以满足软件开发中对…

基于UDP的网络聊天室

客户端 #include <myhead.h> //定义存储信息结构体 typedef struct _MSG {char code; //操作码&#xff1a;L表示登录C表示群聊S表示系统消息S表示退出char name[128]; char txt[256];}msg_t;//定义保存客户端网络信息的链表 typedef struct _ADDR {struct sockaddr_i…

玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM

&#x1f60d; 这篇主要简单记录一些调参实践&#xff0c;无聊时会不定期更新~ 文章目录 0、学习率与batch_size判断1、Epoch数判断2、判断模型架构是否有问题3、大模型 - 计算量、模型、和数据大小的关系4、大模型调参相关论文经验总结5、训练时模型的保存 0、学习率与batch_s…

Spring不再支持Java8了

在今天新建模块的时候发现了没有java8的选项了&#xff0c;结果一查发现在11月24日&#xff0c;Spring不再支持8了&#xff0c;这可怎么办呢&#xff1f;我们可以设置来源为阿里云https://start.aliyun.com/ 。 java8没了 设置URL为阿里云的地址

c++——string字符串____迭代器.范围for.修改遍历容量操作

在成为大人的路上喘口气. 目录 &#x1f393;标准库类型string &#x1f393;定义和初始化string对象 &#x1f4bb;string类对象的常见构造 &#x1f4bb;string类对象的不常见构造 &#x1f4bb;读写string对象 &#x1f393; string类对象的修改操作 &#x1f4…