Собственный массив C ++ в массив C # через C ++ / CLI - PullRequest
1 голос
/ 07 января 2011

У меня есть родное приложение C ++, которое должно вызывать библиотеку C #.Изучив различные варианты, я решил добавить библиотеку C ++ / CLI в качестве оболочки для обработки прямого интерфейса между ними.У меня ОЧЕНЬ большой массив, который я передаю из C ++ в C # (настолько большой, что о создании копии через Marshal :: Copy не может быть и речи).Мне не удалось определить синтаксис.

Объявление функции C #:

void Computation::passInVolume(int size, short volume[])

Функция C ++ / CLI:

void Wrapper::passInVolume(int size, short volume[])
{
    //this call succeeds, but does not contain my data
    array<short>^ locArray = gcnew array<short>(size);

    // This line produces: error C2440: 'type cast' : cannot convert from 
    // 'short []' to 'cli::array<Type> ^'   
    array<short>^ locArray2 = (array<short>^)volume;

    // call requires array<short>^ as input type
    Computation::passInVolume(size, locArray); 
}

Код C ++:

volImage = (short*)malloc(size*sizeof(short));
...
wrapper->passInVolume(size, volImage);

Есть ли способ разыграть это, что мне просто не хватает?Я успешно делал это другим способом, вызывая C ++ из C #, в прошлом без каких-либо проблем (или даже приведения).

1 Ответ

1 голос
/ 07 января 2011

копирование через Marshal :: Copy не может быть и речи

Слишком плохо.Массивы .NET всегда находятся в управляемой куче, вы не можете убедить .NET сделать иначе.

У вас все еще есть несколько вариантов, которые не включают копирование:

  • Перепишите код C #, чтобы использовать указатели (и, конечно, добавьте дополнительные параметры, где это необходимо, для переноса длины).C # может использовать указатель, который был выделен изначально, и выполнять арифметику указателя для поиска оставшихся элементов.

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

...