Ada*_*ile 28 c# c++ interop struct marshalling
我在C++中有以下结构:
#define MAXCHARS 15
typedef struct
{
char data[MAXCHARS];
int prob[MAXCHARS];
} LPRData;
Run Code Online (Sandbox Code Playgroud)
我正在调用一个函数来获取这些结构中的3个数组:
void GetData(LPRData *data);
Run Code Online (Sandbox Code Playgroud)
在C++中我会做这样的事情:
LPRData *Results;
Results = (LPRData *)malloc(MAXRESULTS*sizeof(LPRData));
GetData( Results );
Run Code Online (Sandbox Code Playgroud)
它会工作得很好,但在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;
}
Run Code Online (Sandbox Code Playgroud)
如果我初始化其中3个(及其所有子数组)的数组并将其传递给此:
GetData(LPRData[] data);
Run Code Online (Sandbox Code Playgroud)
它成功返回,但LPRData数组中的数据没有更改.
我甚至尝试创建一个大小为3 LPRData的原始字节数组,并将其传递给函数原型,如下所示:
GetData(byte [] data);
但在这种情况下,我将从第一个LPRData结构中获取"数据"字符串,但在此之后没有任何内容,包括来自同一LPRData的"prob"数组.
有关如何妥善处理此问题的任何想法?
den*_*nny 25
我会尝试在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;
}
Run Code Online (Sandbox Code Playgroud)
*注意TotalBytesInStruct不用于表示变量
JaredPar也是正确的,使用IntPtr类可能会有所帮助,但是因为我使用了PInvoke所以我已经很长时间了.
Jar*_*Par 13
处理指针时的一个技巧就是使用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;
}
Run Code Online (Sandbox Code Playgroud)