Я хотел бы передать двумерный массив / матрицу из 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 #?
Я прочитал документацию о маршалинге массивов, но я не знаю, что лучше по динамически меняющимся массивам.
Любая помощь очень ценится!