In case, someone gets the same problem, I have found a solution:
C++ code:
int SetPointers(int* ID, int* BufferID, int** Pointer, double** Time, int NumberOfPointers);
C# code:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern Int32 SetPointers(Int32[] ID, Int32[] BufferID, IntPtr[] Pointer, IntPtr[] Time, int NumberOfPointers);
public unsafe int SetPointers(int[] IDs, int[] BufferID, ref int[] Pointer, ref double[] Time, int NumberOfPointers)
{
int breturn = -1;
IntPtr[] queue = new IntPtr[NumberOfPointers];
IntPtr[] time = new IntPtr[NumberOfPointers];
for (int i = 0; i < NumberOfPointers; i++)
{
queue[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
time[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)));
}
breturn = SetPointers(IDs, BufferID, queue, time, NumberOfPointers);
if (breturn >= 0)
{
for (int i = 0; i < NumberOfPointers; i++)
{
Pointer[i] = (int)Marshal.ReadInt32(queue[i]);
Time[i] = (double)Marshal.PtrToStructure(new IntPtr(time[i].ToInt32()), typeof(double));
}
}
return breturn;
}