c#对c++动态库的调用全流程以及详解

news2025/1/13 15:59:11

如果对pcl里的函数导出为动态库,分为以下几部分:

  1. 对c++动态库的导出;
  2. c#对c++动态库的加载;
  3. c#对第2步的调用

一、对c++动态库的导出

定义导出的宏定义:

#ifndef EXPORT
#  define EXPORT(rettype) __declspec( dllexport ) rettype __cdecl
#endif

这里的rettype是占位符,用来表示函数的返回值

比如下面的代码就是将 D B S C A N K d t r e e C l u s t e r < p c l : : P o i n t X Y Z > ∗ DBSCANKdtreeCluster<pcl::PointXYZ>* DBSCANKdtreeCluster<pcl::PointXYZ>替代了占位符,其实就是在使用的时候用实际的类型进行了替代。

EXPORT(DBSCANKdtreeCluster<pcl::PointXYZ>*)
segment_dbscankdtreecluster_xyz_ctor(){
    return new DBSCANKdtreeCluster<pcl::PointXYZ>();
}

二、c#对c++动态库的加载

在c#中调用c++导出的动态库,一般是采用c#中的P/Invoke 技术来实现。P/Invoke 是指通过 Platform Invocation Services(平台调用服务)在托管代码中调用非托管函数或动态库的技术。通过Dllimport导入函数:

//导入对应的动态库以及对应的函数
[DllImport("dbscan_pcl_lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr segment_dbscankdtreecluster_xyz_ctor();

可以通过DependenciesGui去查看动态库的调用约定方式,如下图所示:

可以看到其对应的调用方式都是__cdecl的方式,所以在导入的时候也是指定 CallingConvention = CallingConvention.Cdecl,另外再指定函数名字的时候有两种方式,一种是通过EntryPoint ="函数名"的方式,另一种是将底下的函数命名为同名函数,因为这样就会默认导出的函数名是定义的函数名字。并且参数也要是一一对应的。

在这里插入图片描述

所以为了方便就可以对导入的函数进行封装调用,比如把它放进一个类的静态函数中,然后在同一命名空间里的另外一个类就可以封装对其的调用,如下所示:

//做一个命名空间,防止调用冲突
namespace PclSharp
{
    //导入c++动态库的函数,使用静态函数的方式进行调用
    public static class DLLInvoke
    {
        [DllImport("dbscan_pcl_lib.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr segment_dbscankdtreecluster_xyz_ctor();
    }

    //通过另一个类去封装对前面导入的函数的调用
    class DBSCANCluster
    {
        public IntPtr _ptr;
        public DBSCANCluster()
        {
            _ptr = DLLInvoke.segment_dbscankdtreecluster_xyz_ctor();
        }
    }
}

三、在要调用的方法实现调用即可

  • 主要注意参数那些要对应上。

在main函数中使用如下:

DBSCANCluster ec = new DBSCANCluster();
ec.setMinPts(20);

//构建kd-tree
var tree = new PclSharp.Search.KdTreeOfXYZ();
tree.SetInputCloud(cloud);

ec.setTolerance(0.1);
ec.setMinClusterSize(10);
ec.setMaxClusterSize(200);
ec.setSearchMethod(tree);
ec.setInputCloud(cloud);

var clusterIndices = new VectorOfPointIndices();
ec.extract(clusterIndices);

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

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

相关文章

数据结构之单链表oJ练习

目录 1.移除单链表中与给数相同的元素 2.反转链表 3.找中间节点 4.找倒数第k个 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.找公共节点 1.移除单链表中与给数相同的元素 解题思路&#xff1a; 初始化一个新链表&#xff0c;从头结点开始遍历&#xff0c;若相同…

天猫数据分析:2023年Q1空气净化器TOP10品牌销量排行榜

随着全球工业化程度的提高&#xff0c;全球空气污染程度仍将继续增加&#xff0c;各领域对空气净化器的需求不断增长&#xff0c;这也有望带动国内空气净化器行业的市场规模保持增长。 根据鲸参谋电商数据平台的相关数据显示&#xff0c;2023年Q1在天猫平台上&#xff0c;空气净…

02_Lock锁

首先看一下JUC的重磅武器——锁&#xff08;Lock&#xff09; 相比同步锁&#xff0c;JUC包中的Lock锁的功能更加强大&#xff0c;它提供了各种各样的锁&#xff08;公平锁&#xff0c;非公平锁&#xff0c;共享锁&#xff0c;独占锁……&#xff09;&#xff0c;所以使用起来…

shell终端敲入命令计算机都做了什么?

本文参考&#xff1a; linux命令行的运行原理是什么&#xff1f; - 知乎 (zhihu.com) 8.1 键盘敲入 A 字母时&#xff0c;操作系统期间发生了什么&#xff1f; | 小林coding (xiaolincoding.com) shell命令背后的执行过程_shell 命令执行的产生的进程_kyrieguard的博客-CSDN博客…

三维动画渲染用什么软件好?

三维渲染是通过计算机应用程序把 3D 模型生成图像&#xff08;照片级真实感或非照片级真实感&#xff09;的自动化过程&#xff0c;三维动画渲染是动画制作过程的最后一步&#xff0c;该过程将各种视觉效果应用于最终模型&#xff0c;例如阴影、纹理、灯光反射和运动模糊等&…

史上最全的接口测试,吐血整理从零到接口自动化实战...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试&#xf…

04_并发容器类

1. 重现线程不安全&#xff1a;List 首先以List作为演示对象&#xff0c;创建多个线程对List接口的常用实现类ArrayList进行add操作。 public class NotSafeDemo {public static void main(String[] args) {List<String> list new ArrayList<>();for (int i 0; i…

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…

Kubernetes集群的类似top的查看指标的工具ktop

Kubernetes集群的类似top的工具。 遵循Unix/Linux顶级工具的传统&#xff0c;ktop是一个显示有关Kubernetes集群中运行的节点、pod和其他工作负载资源的有用度量信息的工具。 项目地址&#xff1a;https://github.com/vladimirvivien/ktop使用效果图&#xff1a; 特性 集群资…

Linux如何压缩和解压文件

先看压缩 Linux zip 命令用于压缩文件。 zip 是个使用广泛的压缩程序&#xff0c;压缩后的文件后缀名为 .zip 将 /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip&#xff1a; zip -r html.zip /home/html 如果在我们在 /home/html 目录下&#xff0c;可…

经济回暖、兴趣电商升级,品牌在竞争白热化的市场中如何突围?| D3大会圆桌回顾

冬去春来&#xff0c;消费市场韧性回弹&#xff0c;消费趋势正处于“转折”和“跃升”的阶段。新的机遇和挑战也将伴随着新的思维、方法和模式&#xff0c;呈现出更多元的变化和创新&#xff1a;渠道虚实融合&#xff0c;内容为王&#xff0c;社会化媒体成为主战场等消费场景不…

13-NumPy

文章目录 一.基础1.Ndarray对象2.数据类型 二.数组1.数组属性&#xff08;1&#xff09;arange&#xff08;2&#xff09;shape&#xff08;3&#xff09;ndim&#xff08;4&#xff09;itemsize 2.创建数组&#xff08;1&#xff09;empty&#xff08;2&#xff09;zero&#…

【接口自动化测试】月薪12k必会技术,从0到1学习接口自动化测试,6个操作安排的明明白白

导读&#xff1a;在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在修改功能逻辑的时候有回归的能力&#xff0c;同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原…

电商直播商家崛起所面临的问题,订单管理系统起关键性作用

随着短视频直播的兴起&#xff0c;电商企业再次迎来大爆发&#xff0c;随着销量的猛增&#xff0c;随之而来的的订单处理成了各大商家的头等大事&#xff0c;面对再次崛起的电商蓝库云认为企业在订单管理会经常遇到以下问题&#xff1a; 电商企业在订单管理中可能面临以下问题…

js版计算连续12个月计算不超3万公里

<!--考虑比亚迪车友不是程序员的多&#xff0c;写了个html版的&#xff0c;复制以下代码在记事本&#xff0c;改后缀名为test.html&#xff0c;然后用浏览器打开--> <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>…

基于SpringBoot3从零配置MybatisPlus

基于SpringBoot3从零配置MybatisPlus记录 文章目录 1.环境2.表数据准备3. 配置pom配置yml 配置MapperScan 3.问题总结问题1: Property sqlSessionFactory or sqlSessionTemplate are required问题2&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound stat…

Python学习13:说句心里话 A(python123)

描述 分两次从控制台接收用户的两个输入&#xff1a;第一个内容为"人名"&#xff0c;第二个内容为"心里话"。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪…

使用D435i深度相机运行ORB-SLAM3

下载安装链接 下载ORB-SLAM3地址&#xff1a; git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git eigen3多版本安装&#xff1a;https://blog.csdn.net/weixin_41756645/article/details/129570141 ORB-SLAM2中eigen3版本为&#xff1a;3.2.10版本 ORB-SLAM3中eigen3版…

【Jetpack】ViewModel + LiveData + DataBinding 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

文章目录 一、ViewModel LiveData DataBinding 核心要点1、ViewModel 使用要点2、LiveData 使用要点3、DataBinding 使用要点 二、ViewModel LiveData DataBinding 代码示例1、ViewModel LiveData 代码2、build.gradle 构建脚本 - 启用 DataBinding3、DataBinding 布局文件…

ChatGPT实战100例 - (10) 提前体验ChatGPT的多模态绘图功能

文章目录 ChatGPT实战100例 - (10) 提前体验ChatGPT的多模态绘图功能一、需求与思路二、基本调教三、开始秀四、 总结 ChatGPT实战100例 - (10) 提前体验ChatGPT的多模态绘图功能 这个绘图其实比较基础&#xff0c;只能说是能显示个图吧 真要出图&#xff0c;隔壁 文心一言 秒杀…