Я пытаюсь импортировать функцию C ++ в моем коде C #.
Эта функция определяется как:
int SetPointers(int* ID, int* BufferID, int** Pointer, double** Time, int NumberOfPointers);
с идентификатором массив int,
BufferId массив int,
Указатель на массив int,
Время массив двойных,
NumberOfPointers int.
Я пытался использовать IntPtr без успеха.
Вот последний код, который я пробовал:
[DllImport("open.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int SetPointers(int* ID, int* BufferID, ref IntPtr Pointer, ref IntPtr Time, int NumberOfPointers);
public unsafe int _SetPointers(int[] ID, int[] BufferID, ref int[] Pointer, ref double[] Time, int NumberOfPointers)
{
IntPtr fQueue = IntPtr.Zero;
IntPtr fTime = IntPtr.Zero;
int breturn = -1;
fixed (int* fId = ID)
fixed (int* fBufferID = BufferID)
fQueue = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * Pointer.Length);
fTime = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * Timestamp.Length);
breturn = SetPointers(fId , fBufferID, ref fQueue, ref fTime, NumberOfPointers);
return breturn;
}
Есть идеи, как это сделать?
Прежде всего, вы можете использовать IntPtr для своих параметров, а не int [].
После этого я не пробовал это делать, но чтобы маршалировать указатели на указатели, сработали бы «ref IntPtr» или «out IntPtr».
public unsafe int _SetPointers(IntPtr ID, IntPtr BufferID, ref IntPtr Pointer, ref IntPtr Time, int NumberOfPointers);
Также взгляните на этот другой поток: Как мне маршалировать указатель на указатель массива структур?
Других решений пока нет …