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.

Était-ce utile?

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 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);
    }
}

Si vous avez un tableau de tableaux zéro terminal de 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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top