C#传递结构体数组到C++中或DLL中

本文介绍了在C#项目中如何处理结构体数组并传递给C++代码,涉及到托管与非托管内存管理的区别,利用Marshal类进行操作的方法。详细解决方案和参考资料链接已提供。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目需要,刚接触C#,好多东西都不懂,这个小问题就搞了一天哭,现总结如下:

由于C#和C++分别采用托管和非托管的内存管理方式,当传递结构体或结构体数组时,不能按一般的方法进行处理,我们需用到Marshal类(具体可查MSDN),现只贴出我的具体解决方法:

C#中的代码

//车牌数据结构
public struct plateResult
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public byte[] result;
    public Rectangle rct;
}
//初始化存放车牌的结构体
//(由于涉及到托管与非托管内存,故需用Marshal,使用C#的指针IntPtr)
 int plateCount = PLATECOUNT;
 int size = Marshal.SizeOf(typeof(plateResult));
 IntPtr plateInfo = Marshal.AllocHGlobal(size * plateCount);
 plateResult[] plateRct = new plateResult[plateCount];
//调用车牌识别算法
 int pRct = detectPlate(pRGB24bpp, imageWidth[0], imageHeight[0], plateInfo, pCount);
//将获得的数据转为车牌数据结构
for (int index = 0; index < pCount[0]; index++)
{
    IntPtr ptr = (IntPtr)((UInt32)plateInfo + index * size);
    plateRct[index] = (plateResult)Marshal.PtrToStructure(ptr, typeof(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值