C++中的带有指针数组的结构体在C#上怎么封装,并作为形参传给C++dll的函数

C++中的带有指针数组的结构体在C#上怎么封装,并作为形参传给C++dll的函数

问题描述:

#pragma pack(1)
struct SqJpegScliceSize
{
unsigned int scliceSize[64];

unsigned char *jpegDst[64];
};
extern "C" _declspec(dllexport) void SqGetSliceData(SqJpegScliceSize *jss)
这是C++函数和结构体
在C#上怎么写?

 public struct SqJpegScliceSize
 {
     public uint[] scliceSize;
     public IntPtr[] jpegDst;
}
[DllImport("xxxxx.dll",ExactSpelling =false,EntryPoint = "SqGetSliceData",CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static void SqGetSliceData(out SqJpegScliceSize jss);

//初始化结构体
SqJpegScliceSize jss=new SqJpegScliceSize();
jss.scliceSize=new uint[64];
jss.jpegDst=new IntPtr[64];

//调用函数
SqGetSliceData(out jss);

unsigned char *jpegDst[64];不知道你这个意图是什么,是仅仅用来接收64个指针,还是获取64个字符串。如果是64个字符串,则需要定义64个byte类型的数组,然后获取它们的指针放到IntPtr类型的数组中。这需要用到不安全代码。

 byte[][] strs=new byte[64][];
 for(int i=0;i<64;i++)
 { 
     strs[i]=new byte[1024];
     unsafe
     {
            fixed(byte *p=strs[i])
            {
                jpegDst[i]=(IntPtr)p;
            }
     }
 }

不是不能传递64个地址,而是传递的地址都是没有分配空间的,无法进行读写操作。你这64个指针到底指向64个char类型的变量,还是指向64个char类型的数组?不管是变量,还是数组,在传递参数之前都要分配空间。如果指向64个char类型的数组,你需要知道数组的长度是多少,并为其分配相应空间,然后使用不安全代码分别获取它们的首地址,并保存到IntPtr[]类型的数组中。另外,你还需要设置一下结构体的布局,使字节对齐为1.

设置字节对齐

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential,Pack =1)]
  public struct SqJpegScliceSize
 {
     public uint[] scliceSize;
     public IntPtr[] jpegDst;
}

[StructLayout(LayoutKind.Sequential,Pack =1)]

你确定可以了?我觉得我昨天给的代码有问题。。。。。

 using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential,Pack =1)]
 unsafe public struct SqJpegScliceSize
 {
     public fixed uint scliceSize[64];
     public fixed uint jpegDst[64];//指针是unit类型的
}