Маршалинг указателя на массив типов (управляемый C # -> неуправляемый C ++) - PullRequest
0 голосов
/ 24 августа 2009

У меня возникли проблемы с выбором способа представления структуры, содержащей указатель на массив шортов в моем управляемом коде. Структура выглядит следующим образом:

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

память для 'shortValues' выделяется внутри неуправляемого кода - поэтому даже если это поле является просто указателем на массив коротких значений, был добавлен дополнительный уровень косвенности, чтобы выделенная память была видна вызывающей управляемый код) тоже. Поле 'size' представляет количество элементов в массиве. Как мне представить это в управляемом коде?

Я думал, что передам это всего лишь IntPtr, тогда я не мог понять, как получить доступ к значениям, когда неуправляемый вызов вернется.

1 Ответ

0 голосов
/ 24 августа 2009

Да, небезопасный код?

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

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

Если у вас есть указатель на массив 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);
    }
}

Если у вас есть массив массивов с нулевым символом в конце ushort s:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...