Маршалинг указателя на массив типов (управляемый C# -> неуправляемый C++)
Вопрос
У меня возникли проблемы с выбором способа представления структуры, содержащей указатель на массив шортов, в моем управляемом коде.Структура выглядит следующим образом:
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);
}
}
}