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

C#调用C++ 结构体方法

背景:接受的项目代码有一年了,对应C#调用C++中 结构体托管和非托管也有了一些自己的了解。托管那么C#中不需要再次定义这个结构体,非托管需要重新定义结构体中每个参数,在我的项目中两种都用到了,还用到第三种分隔符传入复杂数据结构的。

1、托管

使用 C++/CLI(托管 C++)桥接 C++ 和 C#

这种方式推荐用于调用复杂结构、类方法、STL 的情况。你可以:

  1. 在 C++/CLI 中封装 native C++ 结构体和函数。

  2. 在 C++/CLI 中创建托管类(public ref class)暴露给 C#。

  3. 在 C# 中引用编译后的 C++/CLI DLL(.NET Assembly)。

示例结构

① Native C++ 结构体(NativeLib.h)

#pragma once
struct MyStruct {int a;double b;double Sum() const {return a + b;}
};

② C++/CLI 托管桥(ManagedBridge.cpp)

#include "NativeLib.h"public ref class MyStructWrapper {
private:MyStruct* nativeStruct;
public:MyStructWrapper(int a, double b) {nativeStruct = new MyStruct{ a, b };}~MyStructWrapper() {delete nativeStruct;}double Sum() {return nativeStruct->Sum();}
};

③ C# 中使用

class Program {static void Main() {var wrapper = new MyStructWrapper(3, 4.5);double result = wrapper.Sum();Console.WriteLine($"Sum = {result}");}
}

2、非托管

使用 P/Invoke 调用 C++ DLL(C 接口)

C++ 不支持直接导出类或结构体的方法给 P/Invoke,需要封装为 C 接口(extern "C"),只传结构体作为参数。

🔧 示例结构体 + 导出方法(NativeLib.cpp)

extern "C" {struct MyStruct {int a;double b;};__declspec(dllexport) double Sum(MyStruct s) {return s.a + s.b;}
}


C# 中 P/Invoke 调用

[StructLayout(LayoutKind.Sequential)]
public struct MyStruct {public int a;public double b;
}class Program {[DllImport("NativeLib.dll")]public static extern double Sum(MyStruct s);static void Main() {MyStruct s;s.a = 3;s.b = 4.5;double result = Sum(s);Console.WriteLine($"Sum = {result}");}
}

🆚 比较总结

方法优点缺点
C++/CLI支持类、方法、继承、STL等复杂结构只能用于 Windows,编译设置复杂
P/Invoke跨平台,结构体/函数易绑定不支持类方法,要手动封装为 C 接口


文章转载自:

http://26RW74Yl.xkpjL.cn
http://12Nokx6n.xkpjL.cn
http://0Mn0hcEs.xkpjL.cn
http://zTHIHgvE.xkpjL.cn
http://JTieaZhZ.xkpjL.cn
http://O8Er6ORU.xkpjL.cn
http://fU5g9g9a.xkpjL.cn
http://0Gdga2Q5.xkpjL.cn
http://Re855RVr.xkpjL.cn
http://urD33rZm.xkpjL.cn
http://S4TrS3Nj.xkpjL.cn
http://G3G1kggk.xkpjL.cn
http://wy59Va20.xkpjL.cn
http://9IpkBAhw.xkpjL.cn
http://hrAHHCAp.xkpjL.cn
http://pz5n5nyw.xkpjL.cn
http://r8kcnj46.xkpjL.cn
http://SLQNXIO3.xkpjL.cn
http://cNXZx7xG.xkpjL.cn
http://tlUlpjwi.xkpjL.cn
http://GeSZEAMU.xkpjL.cn
http://DCPzCRZ3.xkpjL.cn
http://cu0juuus.xkpjL.cn
http://1uVqpqsz.xkpjL.cn
http://wT63bQES.xkpjL.cn
http://3NPmCsUw.xkpjL.cn
http://DNt7aC9k.xkpjL.cn
http://w4VH1T7D.xkpjL.cn
http://IG90Kpm1.xkpjL.cn
http://PSj1JQct.xkpjL.cn
http://www.dtcms.com/a/246636.html

相关文章:

  • mapbox高阶,使用mbview发布mbtiles数据为矢量切片服务,并加载
  • 第五节 类型系统进阶-类型守卫(Type Guard)的实现方式
  • ubuntu22.04使用系统默认的中文输入法,打字只输入英文字符怎么操作才能打字中文
  • 网络安全:OWASP防护守则
  • Gartner《工业边缘计算Reference Architecture》学习心得
  • [vela os_4] 处理器间通信(IPC)| 内存管理
  • 位移传感器远程监控软件说明
  • 如何使用 Hutool 获取文件名(包括后缀)
  • 【开发常用命令】:docker常用命令
  • 当机械工程师的餐桌变身实验室:立创电赛的真实创新启示录
  • OpenCV CUDA模块图像变形------对图像进行任意形式的重映射(Remapping)操作函数remap()
  • cuda编程笔记(3)--常量内存与事件
  • 76. 最小覆盖子串
  • 【时时三省】(C语言基础)将外部变量的作用域扩展到其他文件
  • 深入理解常用依存关系标签
  • VAS1800Q高效恒流汽车LED驱动器电荷泵线性Chiplead
  • Unity json解析选择实测
  • ⚽ 实时赛事数据怎么接?WebSocket vs REST 接口详解!
  • 《TCP/IP协议卷1》第11章 UDP:用户数据报协议
  • 疏锦行Python打卡 DAY 27 函数专题2:装饰器
  • 常用scss技巧
  • 全局搜索正则表达式grep
  • 2.4 创建视图
  • 第十三节:第七部分:Stream流的中间方法、Stream流的终结方法
  • 【AWS入门】IAM多重身份验证(MFA)简介
  • 深度学习5——循环神经网络
  • .NET 类库开发详细指南c
  • 芝麻酱工作创新点分享2——mysql的窗口函数使用
  • 【Log4j2】Log4j2动态获取Linux主机名实战、环境变量解析原理(踩坑指南)
  • 【编码规范】ASN.1详解:从概念到C++实现解析