我在这里创建一个新问题,因为我现在知道如何提出这个问题,但我仍然是 PInvoke 的新手。
我有一个 C API,其中包含以下结构:
typedef union pu
{
struct dpos d;
struct epo e;
struct bpos b;
struct spos c;
} PosT ;
typedef struct dpos
{
int id;
char id2[6];
int num;
char code[10];
char type[3];
} DPosT ;
以及以下 API 函数:
int addPos(..., PosT ***posArray,...)
我在 C 中这样称呼它的方式:
int main(int argc, const char *argv[])
{
...
PosT **posArray = NULL;
...
ret_sts = addPos(..., &posArray, ...);
...
}
addPos() 内部的内存将被分配给 posArray 并且它也将被填充。使用 calloc 的分配是这样的:
int addPos(..., PosT ***posArray, ...)
{
PosT **ptr;
...
*posArray = (PosT **) calloc(size, sizeof(PosT *));
*ptr = (PosT *)calloc(...);
...
(*posArray)[(*cntr)++] = *ptr;
...
/* Population */
...
}
我有另一个函数将被调用以释放该内存。
现在我想在 C# 中做同样的事情,
我在我的 C# 类中创建了这个:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DPositionT
{
public int Id;
[MarshalAs(UnmanagedType.LPStr, SizeConst = Constants.Id2Len)]
public string Id2;
public int Num;
[MarshalAs(UnmanagedType.LPStr, SizeConst = Constants.CodeLen)]
public string Code;
[MarshalAs(UnmanagedType.LPStr, SizeConst = Constants.TypeLen)]
public string type;
}
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit )]
struct PosT
{
[System.Runtime.InteropServices.FieldOffset(0)]
DPosT d;
};
我只定义了 d,因为我只打算在我的客户端代码中使用这个联合成员。
现在为了调用 addPos() 我应该如何创建和传递 posArray ?
非常感激你的帮助。