Одним из вариантов является просто использовать C типы # указатель - это требует unsafe
блок (или модификатор метода/класса) и компиляции с /unsafe
:
[DllImport(...)]
static extern int GetBuffer(byte* buffer, ref int maxSize);
Буфер можно выделить несколькими способами. Можно было бы использовать возлагали массив кучи:
fixed (byte* buffer = new byte[4096])
{
int maxSize = buffer.Length;
GetBuffer(buffer, ref maxSize);
}
Другой способ заключается в использовании stackalloc
, хотя это возможно только для маленьких буферов:
byte* buffer = stackalloc byte[4096];
int maxSize = 4096;
GetBuffer(buffer, ref maxSize);
Данный подход практически идентичен кода C в условия исполнения и схемы распределения.
Другой вариант - использовать маршалинг для массивов кучи и полностью избегать указателей.
[DllImport(...)]
static extern int GetBuffer([Out] byte[] buffer, ref int maxSize);
byte[] buffer = new byte[4096];
int maxSize = buffer.Length;
GetBuffer(buffer, ref maxSize);
Под «безопасный режим», я предполагаю, что вы имеете в виду без использования «небезопасным {...}» –
Если он хочет, чтобы код, чтобы быть «безопасными» - почему бы вы предположить, что он хотел бы использовать небезопасное ключевое слово. Таким образом, его код небезопасен? Это просто не имеет никакого смысла. –
@Miky: «w/o» в комментарии Дэна означает «без». Попробуйте снова прочитать эту замену. –