当前位置: 首页 > news >正文

C#与C++结构体的交互

C#在和C++进行交互时,有时候会需要传递结构体。

做一些总结,避免大家在用的时候踩坑。

一般情况

例如我们在C++里定义了一个struct_basic结构体

1 struct struct_basic
2 {
3     WORD  value_1;
4     LONG  value_2;
5     DWORD value_3;
6     UINT  value_4;
7     BOOL  value_5;
8 };

这种情况在C#里调用,只需要注意数据类型对应就行了

在C#里定义如下

1  struct struct_basic
2     {
3         public ushort value_1;
4         public int value_2;
5         public uint value_3;
6         public uint value_4;
7         public bool value_5;
8     }

使用导出函数来测试一下

 1 extern "C" __declspec(dllexport) void get_basic(struct_basic basic);2 3 extern "C" __declspec(dllexport) void get_basic(struct_basic basic)4 {5     basic.value_1 = 1;6     basic.value_2 = 2;7     basic.value_3 = 3;8     basic.value_4 = 4;9     basic.value_5 = FALSE;
10 }

在C#中调用

        [DllImport("lib.dll")]public static extern void get_basic(ref struct_basic basic);static void Main(string[] args){struct_basic basic = new struct_basic();get_basic(ref basic);Console.WriteLine($"{basic.value_1}  {basic.value_2}  {basic.value_3}  {basic.value_4}  {basic.value_5}");}

输出结果如下:

包含字符串的情况

C++

1 struct struct_advanced
2 {
3     WORD id;
4     CHAR message[256];
5 };

这种需要使用MarshalAsAttribute特性来指示如何在托管代码与非托管代码之间封送数据。

UnmanagedType.ByValTStr表示 结构中大小固定的字符串
SizeConst可以指定字符数组的大小说明:
如果未指定CharSet,默认使用的是Ansi(char)。
Unicode为w_char。

C#

1     [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
2     struct struct_advanced
3     {
4         public ushort id;
5 
6         [MarshalAs(UnmanagedType.ByValTStr,SizeConst =256)]
7         public string message;
8     };

使用导出函数测试

C++

1 extern "C" __declspec(dllexport) void get_advanced(struct_advanced* advanced);
2 
3 extern "C" __declspec(dllexport) void get_advanced(struct_advanced* advanced)
4 {
5     advanced->id = 101;
6     lstrcpyW(advanced->message, L"HelloWorld");
7 }

在C#中调用

 1  class Program2     {3         [DllImport("lib.dll")]4         public static extern void get_advanced(ref struct_advanced advanced);5 6         static void Main(string[] args)7         {8             struct_advanced advanced = new struct_advanced();9             get_advanced(ref advanced);
10             Console.WriteLine($"{advanced.id}  {advanced.message}");
11         }
12     }

输出结果:

示例代码

http://www.lryc.cn/news/475430.html

相关文章:

  • sql纵表转横表
  • 数据采集-Kepware OPCUA 服务器实现
  • 初识计算机网络
  • Oracle 第11章:异常处理
  • 导航栏渐变色iOS
  • mysql读写分离
  • 计算机的错误计算(一百四十二)
  • 利用大模型辅助科研论文写作·第一期|论文写作·24-11-02
  • JavaScript。—关于语法基础的理解—
  • Tomcat 11 下载/安装 与基本使用
  • Linux系统时间服务——Chrony服务器
  • C# 接口(Interface)
  • 《高频电子线路》—— 电容三端LC振荡器
  • leetcode35.搜索插入位置
  • Redis全系列学习基础篇之位图(bitmap)常用命令的解析
  • Copilot功能
  • 《GBDT 算法的原理推导》 11-13初始化模型 公式解析
  • # Easysearch 与 LLM 融合打造高效智能问答系统
  • 本地可以插入表记录,生产不能插入表记录
  • 11.Three.js使用indexeddb前端缓存模型优化前端加载效率
  • 功能测试:方法、流程与工具介绍
  • 【Orange Pi 5 Linux 5.x 内核编程】-设备驱动中的sysfs
  • 微信小程序-全局数据共享/页面间通信
  • java计算机毕设课设—Java聊天室(附源码、文章、相关截图、部署视频)
  • 图像识别基础认识
  • 使用 OpenCV 读取和显示图像与视频
  • 【1】Elasticsearch 30分钟快速入门
  • 教材管理系统设计与实现
  • 软考(中级-软件设计师)数据库篇(1101)
  • 安装nscd及glibc包冲突降级【centos7】