Domanda

Sto avendo qualche difficoltà a stabilirsi su un modo per rappresentare una struttura che contiene un puntatore a un array di cortometraggi nel mio codice gestito. La struct è simile al seguente:

typedef struct
{
    short size;
    unsigned short** shortValues;
} UnmanagedStruct;

memoria per 'shortValues' è allocato all'interno codice non gestito - quindi anche se questo campo è semplicemente un puntatore a una matrice di valori brevi, un ulteriore livello di riferimento indiretto è stato aggiunto in modo che la memoria allocata è visto dal chiamante (codice gestito ) pure. Il campo 'size' rappresenta il numero di elementi nella matrice. Come faccio a rappresentare questo in codice gestito?

ho pensato di passare in solo un IntPtr, quindi non riuscivo a capire come accedere ai valori al ritorno della chiamata non gestiti.

È stato utile?

Soluzione

È codice non sicuro ok?

public unsafe struct UnmanagedStruct
{
    public short size;
    public ushort** shortValues;
}

[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);

Se si dispone di un puntatore a un array di 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);
    }
}

Se si ha un array di array null-terminate di ushorts:

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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top