Windows下,C# 通过FastDDS高效通信
目录
- 1、安装FastDDS 库
- 2、使用IDL定义自己的数据格式
- 3、生成DLL
- 3.1 托管 (Managed)模式
- 3.2 非托管 (Unmanaged)模式 -- 可用于Unity
- 代码示例
eprosima Fast DDS is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group).
这里讲讲怎么在C#中也能用上这一能高效通讯的工具
1、安装FastDDS 库
主要参考 Fast DDS documentation ,到官网下载界面下载编译好的版本。 (也可以下载源代码编译,太麻烦,没成功,这里掠过)
填完表格选择

我下载的是2.14.2版本

找到windows安装包

安装完成后会看到\eProsima\fastrtps 2.14.2 文件夹下有这些东西:

里面有一些example,你可以自己cmake编译测试一下。
2、使用IDL定义自己的数据格式
创建在一个空文件夹里创建一个*.idl文件

下面是一个示例 HelloWorld.idl:
struct HelloWorld
{unsigned long long timestamp;octet det_valid[2];float joints[21][3];
};
上面分别对应C++11的数据格式:
uint64_t timestamp;
std::array<uint8_t,2> det_valid;
std::array<std::array<float, 3>, 21> joints;
更多数据格式的对应关系参考: Defining a data type via IDL
现在我们使用Fast DDS-Gen工具基于 HandMessage.idl生成为项目的源代码,这是一个十分优雅的设计。
在该文件夹下,用VS的命令行窗口(系统自带的powershell不一定好使)运行如下命令:

fastddsgen.bat -example CMake .\HelloWorld.idl
理论上fastddsgen.bat已经在你的环境变量里了,如果没有,将
~\eProsima\fastrtps 2.14.2\bin添加到你的环境变量里即可。
现在你会发现多了好多文件:

这里利用CMakeLists.txt 编译时,有可能出现找不到openssl的情况。
可以参考博客安装 win版的OpenSSL,然后在find_package(fastcdr REQUIRED)前添加你的OpenSSL include目录,如set(OPENSSL_INCLUDE_DIR "C:/Program Files/OpenSSL-Win64/include")
其实CMakeLists.txt 中还会有一些诸如库文件路径等的小问题,稍微有点功底都能解决,这里不再赘述。
编译完成后分别运行
.\HelloWorld.exe subscriber
和
.\HelloWorld.exe publisher
看到类似下列输出即为成功:

其实基于idl生成的核心内容是
HelloWorld.h, HelloWorld.cxx, HelloWorldPubSubTypes.h, HelloWorldPubSubTypes.cxx其他如xPublisher, xSubscriber以及PubSubMain无论用什么idl文件生成的都是类似的内容
根据你的任务需求修改Publisher和Subscriber的数据处理
Publisher修改
void HelloWorldPublisher::run()
Subscriber修改
void HelloWorldSubscriber::SubListener::on_data_available(DataReader* reader)
我们可以借鉴
HelloWorldPublisher和HelloWorldSubscriber的写法定义自己的数据处理, 也可以写成兼具Publisher和Subscriber的Sever-Client形式,就看你的具体任务需求了。
一些参考:
关于FastDDS在C#中使用的简单实例
Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)
3、生成DLL
以上,C++部分就讲完了,数据处理怎么样大家各不相同,现在讲C++数据处理部分搞定后怎么让C#调用
仅提供一些参考链接,涉及非个人权力内容,非相关人员不能提供太多东西。
托管DLL和非托管DLL的区别
C#与C++代码的互操作方式
这个博客写的很好:
vs2019 实现C#调用c++的dll两种方法
注意编译形式
Release/Debug和 平台x64/x86的统一
3.1 托管 (Managed)模式
利用C++/CLI项目编译
CLI不会默认勾选,需要自行勾选

安装后,新建项目即可选择

剩下的可以参考
C#调用C++类,托管C++方式实现(创建C++ CLR dll项目)
C# 调用 C++ DLL(4) 托管方式:需要使用c++类
C#如何调用C++(进阶篇)
如何用轻松用C#(.NET)调用自己编写C++的CLR(DLL)类库(Visual Studio)
3.2 非托管 (Unmanaged)模式 – 可用于Unity
这部分的简单实现可以参考
C++生成dll与C#调用
C# 调用 dll 文件
如何在C#代码中调用C++函数 (一)
适用于FastDDS的样例可参见代码示例
代码示例
仅向相关人员提供,生人勿扰。
相关文章:
Windows下,C# 通过FastDDS高效通信
目录 1、安装FastDDS 库2、使用IDL定义自己的数据格式3、生成DLL3.1 托管 (Managed)模式3.2 非托管 (Unmanaged)模式 -- 可用于Unity 代码示例 eprosima Fast DDS is a C implementation of the DDS (Data Distribution Service) …...
【模型】ResNet
ResNet(Residual Network,残差网络)是一种用于图像识别等任务的深度神经网络架构,由何凯明等人于2015年提出。它在计算机视觉领域中具有重要意义,因为它解决了随着网络层数加深而导致的“梯度消失”或“梯度爆炸”问题…...
Objective-C中NSExpression与NSPredicate的协同艺术
标题:Objective-C中NSExpression与NSPredicate的协同艺术 引言 在Objective-C的丰富生态中,NSExpression和NSPredicate是两个强大的工具,它们在处理数据集合和执行复杂查询时发挥着关键作用。本文将深入探讨这两个API的协同工作方式&#x…...
Apache-JMeter压测工具教程
下载安装 《JMeter官网下载》 下载完成后,找个文件夹进行解压 配置环境变量 JAVA_HOME(如果是JAVA8还需要配置CLASSPATH)、JMETER_HOME JMETER_HOME修改bin目录下的jmeter.properties文件编码为UTF-8 5.6.3这个版本encoding已经默认为UT…...
Spring Boot集成selenium实现自动化测试
1.什么是selenium? Selenium 是支持web 浏览器自动化的一系列工具和 库的综合项目。 它提供了扩展来模拟用户与浏览器的交互,用于扩展浏览器分配的分发 服务器, 以及用于实现W3C WebDriver 规范 的基础结构, 该规范允许您为所有主…...
基于phpstudy对cmseasy5.5进行漏洞复现
目录: 漏洞复现的cmseasy5.5百度网盘链接 安装cmseasy: 1.在phpstudy上安装cmseasy 2.设置mysql密码为phpstudy内置mysql的密码并检查安装环境 3.安装后查看mysql内cmseasy是否有内容 获取用户名和密码过程: 1.查看源码发现有个remotelo…...
【c++】 C语言的输入与输出C++的IO流STL空间配置器
主页:醋溜马桶圈-CSDN博客 专栏:c_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.C语言的输入与输出 2.流是什么 3.CIO流 3.1 C标准IO流 3.2 C文件IO流 4.stringstream的简单介绍 5.什么是空间配置器 6.为什么需要…...
基于Faster-RCNN的停车场空位检测,支持图像和视频检测(pytorch框架)【python源码+UI界面+功能源码详解】
功能演示: 基于Faster-RCNN的停车场空位检测系统,支持图像检测和视频检测(pytorch框架)_哔哩哔哩_bilibili (一)简介 基于Faster-RCNN的停车场空位检测系统是在pytorch框架下实现的,这是一个…...
Vue3从零开始——带你轻松掌握组件的基本操作
文章目录 1. Vue 组件的基础概念1.1 什么是组件?1.2 组件的作用1.3 组件的分类(全局组件 vs 局部组件) 2. 创建和注册组件2.1 单文件组件(SFC)2.2 全局组件注册2.3 局部组件注册 3. 组件命名格式4. ref获取DOM元素4.1 …...
【MySQL 03】库的操作 (带思维导图)
文章目录 🌈 一、创建数据库🌈 二、查看数据库🌈 三、使用数据库🌈 四、修改数据库🌈 五、删除数据库🌈 六、备份数据库🌈 七、恢复数据库🌈 八、字符集和校验规则⭐ 1. 查看系统默认…...
SpringBoot-读取配置文件内容
目录 前言 主页(端口号默认8080) 1 Value 注解 引用变量的使用 2 Environment 对象 3 ConfigurationProperties (配置内容和对象,进行相互绑定) 前言 读取配置文件有3 种方式 (1) Value注解 (2) Environm…...
springboot整合springmvc
1、创建springboot项目,勾选Spring web 当前springboot选择的是2.6.13版本,jdk1.8尽量选2.几的springboot 2、在pom.xml中导入相应的坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...
el-cascader多选的父子关联和父子不关联功能
公用html: <el-cascader v-model"data" :options"optionsData" :props"props" clearable> </el-cascader> 公用js变量: data () {return {// 绑定的数组data: [],// 绑定的选项数据optionsData: []} }, 公…...
#Datawhale AI夏令营第4期#多模态大模型Task2
赛事进阶解读 关于赛事介绍: Better Synth 是一项以数据为中心的挑战赛,考察如何合成与清洗图文数据以在多模态大模型上取得更优的图片理解能力。 本次比赛基于 Mini-Gemini 模型进行训练,只关注于预训练(模态间对齐)…...
LeetCode 热题100-1
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任…...
表现良好的最长时间段(LeetCode)
题目 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格…...
【性能优化】DNS解析优化
前言 DNS解析过程消耗时间DNS有本地缓存 比如首次访问某站点,会耗费很多时间进行DNS解析,但解析结束后会将ip地址存入本地设备,后续再访问此域名时就会直接从缓存中取。 首次访问页面时,本页面的DNS解析是无法优化的࿰…...
【剑指 offer】合并链表
目 录 描述: 输入两个递增的链表,单个链表的长度为 n,合并这两个链表并使新链表中的节点仍然是递增排序的。 思路: 定义一个新链表,先进行我们的原俩链表判断,然后比较俩链表的每个节点大小,然…...
红酒与节日装饰:打造节日氛围的需备品
随着节日的脚步渐渐临近,节日的氛围也愈发浓厚。在这个特殊的时刻,红酒与节日装饰无疑成为了营造节日氛围的需备品。洒派红酒(Bold & Generous)作为定制红酒的品牌,其不同的韵味与节日装饰的精致整合,共…...
Element Plus的el-carousel走马灯平铺多张图片
效果 <template><div class"system-banner"><el-carousel height"320px" indicator-position"outside" :autoplay"false"><el-carousel-item v-for"(item, index) in govList" :key"index"…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
