Как маршалировать многомерные массивы

У нас есть некоторый код взаимодействия, который включает в себя матрицы. Я пытался вызвать родную DLL, и по большей части он работает очень надежно.

Я полагаюсь на стандартную сортировку по .net, избегая неуправляемых указателей и, скорее, используя .net-массивы по большей части и, возможно, byref здесь и там. В статье .net говорится, что многомерные массивы неявно распределяются как одномерные массивы столбцов, что было бы хорошо.

Единственное, что, похоже, не работает, пытается маршалировать многомерный массив, поскольку компилятор F # жалуется, что float[,] не допускается в объявлении extern. Есть ли способ ограничить это ограничение?

Я знаю типы PinnedArray и PinnedArray2 из F # PowerPack, но я искал решение, основанное на управляемых указателях, и, что более важно, я бы хотел не включать F # PowerPack как зависимость только для классов PinnedArray.

Ответ 1

В этом описании о Blittable и Non-Blittable Types в приведенной ниже ссылке вы можете попробовать System.Double вместо float, потому что они не требуют преобразования, когда они передаются между управляемым и неуправляемым кодом, что означает, что больше не требуется специальная обработка межплеерным маршалером с плюсом в производительности: https://msdn.microsoft.com/en-us/library/75dwhxf7%28v=vs.110%29.aspx

Я сделал поиск и нашел эту связанную тему, которая может вам помочь:

Threat like a single array: http://stackoverflow.com/a/18607817/4597705