我在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”数组。
关于如何正确处理此问题的任何想法?
我会尝试为您的结构取消关联添加一些属性
[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以来已经有一段时间了,所以我很生锈。