Marshalling einen Zeiger auf ein Array von Typen (verwaltete C # -> nicht verwaltete C ++)
Frage
Ich habe einige Probleme auf eine Weise Einschwingzeit eine Struktur darstellen, die einen Zeiger auf ein Array von Shorts in meinem verwalteten Code enthält. Die Struktur sieht wie folgt aus:
typedef struct
{
short size;
unsigned short** shortValues;
} UnmanagedStruct;
Speicher für ‚shortValues
‘ innerhalb unmanaged Code zugeordnet ist - also auch wenn das Feld einfach ein Zeiger auf ein Array von kurzen Werten ein zusätzlicher Dereferenzierungsebene hinzugefügt wurde, so dass zugewiesene Speicher vom Anrufer gesehen wird (verwalteten Code ) zu. Die ‚size
‘ Feld stellt die Anzahl der Elemente in dem Array. Wie gebe ich das in verwaltetem Code?
Ich dachte, ich es in nur einen IntPtr
passieren würde, dann könnte ich nicht herausfinden, wie die Werte, sobald die nicht verwalteten Aufruf zurückkehrt zu gelangen.
Lösung
Ist unsicherer Code ok?
public unsafe struct UnmanagedStruct
{
public short size;
public ushort** shortValues;
}
[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);
Wenn Sie einen Zeiger auf ein Array von 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);
}
}
Wenn Sie ein Array von nullterminierten Arrays von ushort
s haben:
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);
}
}
}