由于项目需要,刚接触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(