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

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

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Небезопасный код — это нормально?

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

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

Если у вас есть указатель на массив ushortс:

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

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);
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top