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"…...
智慧交通落地难题:为什么80%的智能信号灯项目效果不达预期?
智慧交通落地困境:从技术神话到现实瓶颈的深度解构 清晨7点30分,北京东三环的某个十字路口,20名交警正在手动调节信号灯——这个造价480万元的智能信号系统在早高峰时段被完全弃用。类似的场景正在全国至少17个城市重复上演,某头部…...
Repomix用户体验:CLI界面设计与交互的终极指南
Repomix用户体验:CLI界面设计与交互的终极指南 【免费下载链接】repomix 📦 Repomix (formerly Repopack) is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your codebase t…...
Flutter弹窗层级混乱?手把手教你用Overlay管理多个弹窗的显示顺序
Flutter弹窗层级管理实战:用Overlay解决多弹窗叠加难题 在移动应用开发中,弹窗是用户交互的重要组成部分。但当多个弹窗同时出现时,开发者常会遇到"哪个弹窗应该显示在最上层"的困扰。想象一下这样的场景:用户正在填写…...
毕设程序java师生交流系统的设计与实现 基于Java的师生互动教学平台设计与实现 基于SpringBoot的在线教育沟通系统开发
毕设程序java师生交流系统的设计与实现343xt8ar(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的飞速发展,传统的教育模式正在经历一场深刻的变革。互联…...
cv_unet_image-colorization模型压缩与量化:面向移动端的部署优化
cv_unet_image-colorization模型压缩与量化:面向移动端的部署优化 想把那个能把黑白照片变彩色的AI模型塞进手机里?这听起来挺酷,但实际操作起来,你会发现它又大又慢,手机根本跑不动。这就像你想把一台高性能游戏电脑…...
Qwen3-TTS部署案例:车载中控系统离线多语种导航语音引擎集成
Qwen3-TTS部署案例:车载中控系统离线多语种导航语音引擎集成 在智能座舱快速演进的今天,车载语音交互已从“能听清”迈向“听得懂、说得好、有温度”的新阶段。传统TTS方案常受限于网络依赖、语种覆盖窄、响应延迟高、方言适配弱等问题,难以…...
从Go协程到Java 21虚拟线程:一个Gopher的迁移避坑指南与性能对比
从Go协程到Java 21虚拟线程:一个Gopher的迁移避坑指南与性能对比 作为一名长期深耕Go语言生态的开发者,第一次接触Java 21的虚拟线程时,那种熟悉又陌生的感觉令人印象深刻。Go的goroutine以其轻量和高效著称,而Java平台线程的笨重…...
Greasy Fork:用户脚本管理的一站式开源解决方案
Greasy Fork:用户脚本管理的一站式开源解决方案 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 从脚本新手到社区贡献者的进阶指南 一、功能探索:解锁浏览器增强新…...
SDMatte惊艳效果展示:高清透明PNG在海报/PPT/详情页真实复用案例
SDMatte惊艳效果展示:高清透明PNG在海报/PPT/详情页真实复用案例 1. 为什么你需要关注SDMatte 在日常设计工作中,抠图可能是最耗时但又必不可少的环节。无论是制作电商详情页、设计海报还是准备PPT素材,一个高质量的透明背景图片往往能大幅…...
致开发者:别再重复造轮子,这个开源商城系统让你把时间花在刀刃上
作为开发者,你是否厌倦了每次新项目都要从零搭建电商后台?商品、订单、会员、营销……这些基础模块耗费了你多少宝贵的创造力?今天,我们想和你聊聊一个能让你“拿来即用,改也不难”的解决方案——CRMEB开源商城系统。它…...
