Marshalling einen Zeiger auf ein Array von Typen (verwaltete C # -> nicht verwaltete C ++)

StackOverflow https://stackoverflow.com/questions/1323206

  •  19-09-2019
  •  | 
  •  

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.

War es hilfreich?

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 ushorts:

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 ushorts 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);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top