У меня есть проект, который обрабатывает значительно большие массивы. Часть кода написана на 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.