Да, массив маршалируется как SAFEARRAY. Не разбить маршаллер пинвока довольно необычно. Объявите элемент Data как IntPtr, затем используйте Marshal.Copy () для копирования данных.
Помните, что это будет сложно использовать и в Си. Есть проблема с управлением памятью, не ясно, кому принадлежит массив. Чаще всего функция C будет использовать malloc () для выделения массива. Это большая проблема, вы не можете освободить этот массив в C #, нет способа вызвать free (). У вас будет непоправимая утечка памяти. Если вы не можете переписать код C, вам нужно написать оболочку на языке C ++ / CLI, чтобы вы могли вызывать free (). Даже это сложно, если C dll не использует тот же CRT, что и код C ++ / CLI. Вы должны скомпилировать код C с параметром / MD.