我在C++中有以下结构:
#define MAXCHARS 15 typedef struct { char data[MAXCHARS]; int prob[MAXCHARS]; } LPRData;
我正在调用一个函数来获取这些结构中的3个数组:
void GetData(LPRData *data);
在C++中我会做这样的事情:
LPRData *Results; Results = (LPRData *)malloc(MAXRESULTS*sizeof(LPRData)); GetData( Results );
它会工作得很好,但在C#我似乎无法让它工作.我已经像这样创建了一个C#结构:
public struct LPRData { /// char[15] [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)] public string data; /// int[15] [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 15)] public int[] prob; }
如果我初始化其中3个(及其所有子数组)的数组并将其传递给此:
GetData(LPRData[] data);
它成功返回,但LPRData数组中的数据没有更改.
我甚至尝试创建一个大小为3 LPRData的原始字节数组,并将其传递给函数原型,如下所示:
GetData(byte [] data);
但在这种情况下,我将从第一个LPRData结构中获取"数据"字符串,但在此之后没有任何内容,包括来自同一LPRData的"prob"数组.
有关如何妥善处理此问题的任何想法?
我会尝试在struct decloration中添加一些属性
[StructLayout(LayoutKind.Sequential, Size=TotalBytesInStruct),Serializable] public struct LPRData { /// char[15] [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)] public string data; /// int[15] [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 15)] public int[] prob; }
*注意TotalBytesInStruct不用于表示变量
JaredPar也是正确的,使用IntPtr类可能会有所帮助,但是因为我使用了PInvoke所以我已经很长时间了.
处理指针时的一个技巧就是使用IntPtr.然后,您可以在指针上使用Marshal.PtrToStructure,并根据结构的大小递增以获得结果.
static extern void GetData([Out] out IntPtr ptr); LPRData[] GetData() { IntPtr value; LPRData[] array = new LPRData[3]; GetData(out value); for (int i = 0; i < array.Length; i++) { array[i] = Marshal.PtrToStructure(value, typeof(LPRData)); value += Marshal.SizeOf(typeof(LPRData)); } return array; }