Какой безопасный способ передать массив массивов в DLL в C #? - PullRequest
3 голосов
/ 14 ноября 2009

У меня есть массив массивов, которые я хочу передать в DLL. Я сталкиваюсь с ошибкой «Нет поддержки маршалинга для вложенных массивов».

Я могу передать один массив в порядке, но если я соберу их в стек, он потерпит неудачу. Мне нужен / нужен "безопасный" способ передачи массива массивов.

private static extern int PrintStuff(string[][] someStringsInGroups, int numberOfGroups, int[] lengthSetsInGroups);

РЕДАКТИРОВАТЬ: Я также готов, с достаточным разочарованием и болью, принять решение, включающее в себя маршалинг.

Ответы [ 2 ]

1 голос
/ 14 ноября 2009

Вы можете преобразовать двойной массив в один массив (т.е. сгладить его). Это можно сделать, сохранив переменные width и height и получив доступ к индексам следующим образом:

string atXY = someStringsInSingleArray[(y * width) + x];

Массив может быть преобразован следующим образом:

string * array = new string[width * height];

for (unsigned int y = 0; y < height; ++y)
{
    for (unsigned int x = 0; x < width; ++x)
    {
        array[(y * width) + x] = someStringsInGroups[x][y];
    }
}

// (pass single array to dll)

delete [] array;
0 голосов
/ 18 августа 2014

Я просто наткнулся на то, что может быть не так безопасно, но намного быстрее, так как выделяются только указатели.

http://www.mycsharp.de/wbb2/thread.php?threadid=82380

Это на немецком языке, но код в конце страницы готов для копирования / вставки. В моем случае я просто сделал класс универсальным, чтобы он не только поддерживал double.

Имейте в виду, я не знаю, что такое string [] [], поскольку я предполагаю, что string будет маршализоваться в char *, поэтому у вас будет char [] [] * вместо double [] [], как в примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...