Marshaling un pointeur sur un tableau de types (géré C # -> C ++ non géré)
Question
Je suis un peu de difficulté s'installer sur une façon de représenter une structure qui contient un pointeur sur un tableau de courts métrages dans mon code managé. Le struct ressemble à ceci:
typedef struct
{
short size;
unsigned short** shortValues;
} UnmanagedStruct;
mémoire pour « shortValues
» est attribué à l'intérieur du code non managé - donc, même si ce domaine est tout simplement un pointeur sur un tableau de valeurs courtes, un niveau supplémentaire d'indirection a été ajouté afin que la mémoire allouée est perçue par l'appelant (code managé ) aussi. Le champ « size
» représente le nombre d'éléments dans le tableau. Comment dois-je représenter ce dans le code managé?
Je pensais passer dans juste un IntPtr
, alors je ne pouvais pas comprendre comment accéder aux valeurs une fois que les retours d'appels non gérés.
La solution
est un code dangereux ok?
public unsafe struct UnmanagedStruct
{
public short size;
public ushort** shortValues;
}
[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);
Si vous avez un pointeur sur un tableau de ushort
s:
public static unsafe void WriteValues()
{
UnmanagedStruct s;
GetUnmanagedStruct(out s);
for (var i = 0; i < s.size; i++)
{
ushort x = (*s.shortValues)[i];
Console.WriteLine(x);
}
}
Si vous avez un tableau de tableaux zéro terminal de ushort
s:
public static unsafe void WriteValues()
{
UnmanagedStruct s;
GetUnmanagedStruct(out s);
for (var i = 0; i < s.size; i++)
{
for (ushort* p = s.shortValues[i]; p != null; p++)
{
ushort x = *p;
Console.WriteLine(x);
}
}
}