Empacotamento um ponteiro para uma matriz de tipos (gerido C # -> não gerenciado C ++)

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu estou tendo alguns problemas de se estabelecer em uma maneira de representar uma estrutura que contém um ponteiro para uma matriz de shorts no meu código gerenciado. Os olhares struct como este:

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

memória para 'shortValues' é alocado dentro do código não gerenciado - portanto, mesmo que esse campo é simplesmente um ponteiro para uma matriz de valores curtos, um nível adicional de engano foi adicionado para que a memória alocada é visto pelo chamador (código gerenciado ) também. O campo 'size' representa o número de elementos na matriz. Como faço para representar esta em código gerenciado?

Eu pensei que eu ia passá-lo em apenas uma IntPtr, então eu não conseguia descobrir como acessar os valores uma vez que a chamada retorna não gerenciados.

Foi útil?

Solução

É ok código inseguro?

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

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

Se você tem um ponteiro para uma matriz 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);
    }
}

Se você tem um array de arrays de terminação nula 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);
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top