Как передать массив C # в C ++ и вернуть его обратно в C # с дополнительными элементами? - PullRequest
12 голосов
/ 02 октября 2011

У меня есть проект C #, который использует C ++ DLL. (в визуальной студии 2010)

Я должен передать массив int из кода C # в функцию C ++, и функция C ++ добавит несколько элементов в массив, когда управление вернется в код C #, код C # также добавит элементы в тот же массив.

Первоначально я объявил массив (размером 10000) в коде C #, и код C ++ может добавлять элементы (потому что это был просто массив int, распределение памяти такое же), но проблема в том, что у меня возникла ошибка времени выполнения из-за вне массива.

Я могу увеличить размер до 100000, но опять же я не знаю, сколько элементов добавит код C ++ (даже это может быть только 1 элемент).

Итак, существует ли общая структура данных (динамический массив) для обоих или другого способа? Я пользуюсь Visual studio 2010.

Нечто подобное я хочу сделать.
PS: не скомпилированный код, и здесь я использовал массив char вместо массива int.

C # код

[DllImport("example1.dll")]
private static extern int fnCPP (StringBuilder a,int size)
...

private void fnCSHARP(){
    StringBuilder buff = new StringBuilder(10000);
    int size=0;
    size = fnCPP (buff,size);
    int x = someCSHARP_fu();
    for ( int i=size; i < x+size; i++) buff[i]='x';// possibility of run time error
}

C ++ код

int fnCPP (char *a,int size){
  int x = someOtherCpp_Function();
  for( int i=size; i < x+size ; i++) a[ i ] = 'x'; //possibility of run time error 
  return size+x;
}

1 Ответ

8 голосов
/ 02 октября 2011

В MSDN есть хорошая статья о передаче массивов между управляемым и неуправляемым кодом Здесь .Вопрос в том, зачем вам сначала передавать массив из C # в C ++?Почему нельзя выполнить распределение на стороне C ++ (в вашем методе fnCPP) и вернуть указатель на код C #, а затем просто использовать Marshal.Copy( source, destination, 0, size ), как в , еще один вопрос Stackoverflow ?Чем в вашем методе fnCSHARP вы можете скопировать содержимое массива в некоторую структуру данных переменной длины (например, List).

...