Как маршалировать многомерные массивы
У нас есть некоторый код взаимодействия, который включает в себя матрицы. Я пытался вызвать родную 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