MarshalAs приводит к копии массива? - PullRequest
0 голосов
/ 05 января 2019

У меня есть проект, который обрабатывает значительно большие массивы. Часть кода написана на C, а часть написана на C #. Для передачи данных из C в C # я использую атрибут MarshalAs. Поскольку массивы большие, я бы лучше не копировал. Поэтому мой вопрос таков: MarshalAs приведет к тому, что данные будут скопированы из C в C #, или C # byte[] будет относиться к тому же местоположению, которое было выделено C?

Функция C отвечает за передачу данных в C #, что означает, что я использую обратный вызов. Обратный вызов выглядит так:

void (*to_call)(const uint8_t* buffer, int buffer_length);

DLLEXPORT
init(void(*callback)(const uint8_t* buffer, int buffer_length))
{
    to_call = callback;
}

В конечном итоге обратный вызов to_call будет вызван из C. Код C # выглядит следующим образом:

public delegate void Callback([In][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]byte[] buffer, int bufferLength);

[DllImport(DLLPath)]
public static extern void init(Callback callback);

Я также хотел бы знать, как ответ распространяется на .Net Framework и .Net Core.

...