Во-первых, тип возвращаемой вами импортированной функции должен быть либо IntPtr
, либо [MarshalAs(UnmanagedType.LPStruct)] xfoilResults_t
.
Второе важное замечание: если xfoilResults () выделяет и заполняет данные в этой структуре, где-то должна быть вторая функция для очистки этой памяти. Вы также должны импортировать это - и вызывать его по мере необходимости, иначе вы получите утечки памяти.
Если вы собираетесь упорядочить это вручную (т. Е. Импорт возвращает IntPtr), вы можете использовать
IntPtr retval = xfoilResults();
var results = (xfoilResults_t)Marshal.PtrToStructure(
retVal,
typeof(xfoilResults_t));
//Do the following for each IntPtr field
double[] pCL = new double[results.nEntries];
Marshal.Copy(results.pCL, pCL, 0, results.nEntries);
//Don't forget to call whichever function is cleaning up the unmanaged memory.