Если я правильно понимаю, вы передаете массив от C# до C (или C ++) кода. Проблема с подходом к отправке массива напрямую методу, подобному xyz(double* a, double* b)
, заключается в том, что код не может знать размеры массивов. Это может привести к исключениям нарушения прав доступа, если код C / C ++ пытается получить доступ к элементу, который находится за пределами массива.
Есть несколько способов обойти это - либо с помощью SafeArray из C# ( который уже содержит атрибут размера), отправив массивы в некоторый метод связывания с размерами или передав данные в структуре, например:
internal struct ArraysStruct
{
public int floatArraySize;
public IntPtr floatArray;
public int uintArraySize;
public IntPtr uintArray;
}
Что затем будет сопоставлено на стороне C / C ++ что-то вроде:
typedef struct ArraysStruct
{
size_t floatArraySize;
float* floatArray;
size_t uintArraySize;
unsigned int* uintArray;
}
Вам нужно будет использовать Marshal.AllocHGlobal()
, чтобы сначала распределить массивы по размерам (в C#), а затем Marshal.FreeHGlobal()
, когда вы закончите с ними.