Проблема в том, что когда вы вызываете ваш обратный вызов из DLL C ++, nbArr указывает на первое значение в массиве значений типа double, созданном в собственном коде.Лучший способ - выполнить маршалирование в нативный код и из него, чтобы получить желаемый результат.
Чтобы упорядочить эти данные, вы должны передать массив как тип IntPtr, а не тип double [].Вам также необходимо передать количество элементов в массиве.Таким образом, мы имеем дело с указателями, которые можно маршалировать.
Вот завершенный код:
C #
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void FuncPtr(ref IntPtr dblArr, int size);
[DllImport("test1dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void callCSharpFunctionDblArr(IntPtr fctPointer);
public static void printInConsoleDblArr(ref IntPtr nbArr, int size)
{
// Marshal native to managed
double[] values = new double[size];
Marshal.Copy(nbArr, values, 0, size);
Console.Write("value = ");
for (int i = 0; i < size; i++)
Console.Write(values[i] + "; ");
Console.WriteLine();
for (int i = 0; i < size; i++)
values[i] = values[i] + 1;
Console.Write("value = ");
for (int i = 0; i < size; i++)
Console.Write(values[i] + "; ");
Console.WriteLine();
// Marshal managed to native
Marshal.Copy(values, 0, nbArr, size);
}
static void Main(string[] args)
{
FuncPtr printInConsoleDblArrDelegate =
new FuncPtr(printInConsoleDblArr);
IntPtr printInConsoleDblArrPtr =
Marshal.GetFunctionPointerForDelegate(printInConsoleDblArrDelegate);
Console.WriteLine("Second time called from C++ using the call back !!!");
callCSharpFunctionDblArr(printInConsoleDblArrPtr);
Console.ReadLine();
}
C ++
__declspec(dllexport) void callCSharpFunctionDblArr( void *fctPointer(double*&, int size) )
{
double* dbl = new double[5];
for(int i=0; i<5; i++)
dbl[i] = (0.5*i);
for(int i=0; i<5; i++)
std::cout << "Before :: dbl[" << i << "] = " << dbl[i] << std::endl;
fctPointer(dbl, 5);
for(int i=0; i<5; i++)
std::cout << "After :: dbl[" << i << "] = " << dbl[i] << std::endl;
}
Вы также захотите освободить динамическую память, созданную вами в собственном коде C ++.