Передача 2D массива / матрицы из C ++ dll в C # - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел бы передать двумерный массив / матрицу из DLL C ++ в программу на C #.Число строк является динамическим, а количество столбцов всегда 5.

Сначала я попробовал это с 1D-массивом, и это работает:

В C ++:

extern "C" __declspec(dllexport) int *test()
{
    int Dynamically_changing_rows = rand() & 10 + 5;
    int * oneD_array= new int[Dynamically_changing_rows];
    for (int i =0; i < Dynamically_changing_rows; i++)
    {
        oneD_array[i] = i;
    }

    return oneD_array;
}

В C #:

[DllImport("myDll.dll"), CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr test();

static void Main()
{
    IntPtr ptr = test();
    int arrayLength = Marshal.ReadInt32(Ptr);
    int[] result = new int[arrayLength];
    Marshal.Copy(ptr, result, 0, arrayLength);
    //Now I have the array in result array. 

    ReleaseMemory(ptr); // function to delete pointer in C++.
}

Проблема возникает, когда я хочу сделать нечто подобное с 2D-массивом.

В C ++:

extern "C" __declspec(dllexport) int **test()
{
    int **TwoD_array;
    int Dynamically_changing_rows = rand() & 10 + 5;
    TwoD_array = new int*[Dynamically_changing_rows +1];
    int columns = 5;

    // Adding some array values:
    for (int i = 0; i < (Dynamically_changing_rows +1); i++)
    {
        TwoD_array[i] = new int[columns];
        for (int j = 0; j <= columns; j++)
        {
            TwoD_array[i][j] = i*j;
        }
    }
    // Save the number of rows as the first value: 
    TwoD_array[0][0] = Dynamically_changing_rows; 
}

В C #:

[DllImport("myDll.dll"), CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr test();

static void main()
{
    intPtr ptr = test();
    IntPtr ptrToPtr = Marshal.ReadIntPtr(ptr);

Это дает мне правильную длину массива (указатель на первое значение):

    int arrayLength= Marshal.ReadIntPtr(ptrToPtr); 

Это не работает:

    int [,] result2D = new int[arrayLength, 5];
    Marshal.Copy(ptrToPtr, result2D, 0,arrayLength);

Поскольку описание Marshal.Copy гласит: " копирует данные из одномерного массива .. "

Как я могу получить двумерный массив в result2D[arrayLength, 5] в C #?

Я прочитал документацию о маршалинге массивов, но я не знаю, что лучше по динамически меняющимся массивам.

Любая помощь очень ценится!

...