При сортировке массива неизвестного размера от нативного к управляемому, я считаю, что лучшая стратегия выглядит следующим образом
- Введите массив в
IntPtr
в управляемом коде
- Пусть нативный код возвращает и массив, и параметр размера.
- Вручную упорядочить данные из
IntPtr
в пользовательскую структуру на управляемой стороне.
Поэтому я бы внес следующие изменения в ваш код.
Native:
extern "C" __declspec(dllexport) bool GetTable( TABLE_ENTRY** table, __int32* pSize )
{
*table = &global_dll_table.front();
*pSize = static_cast<int32>(global_dll_table.size());
return true;
}
Управляется:
[DllImport("MyDll.dll",
CallingConvention = CallingConvention.Winapi,
CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool GetTable(out IntPtr arrayPtr, out int size);
public static List<TableEntry> GetTable() {
var arrayValue = IntPtr.Zero;
var size = 0;
var list = new List<TableEntry>();
if ( !GetTable(out arrayValue, out size)) {
return list;
}
var tableEntrySize = Marshal.SizeOf(typeof(TableEntry));
for ( var i = 0; i < size; i++) {
var cur = (TableEntry)Marshal.PtrToStructure(arrayValue, typeof(TableEntry));
list.Add(cur);
arrayValue = new IntPtr(arrayValue.ToInt32() + tableEntrySize);
}
return list;
}