Как передать указатель на указатель байтового массива в C # - PullRequest
0 голосов
/ 23 февраля 2019

Мне нужно вызвать из приложения C # функцию C (из DLL), объявленную как:

void fillBuffer( uint8_t ** pData, uint32_t * size );

Эта функция проверяет, является ли pData ненулевым, и в случае, если она заполняет буфер некоторыммодные данные.Переменная size используется в качестве входного параметра для ограничения количества байтов, которые будут записаны в pData, и в качестве выходного параметра, чтобы сообщить, сколько байтов было фактически записано.

В случае pData равно нулю, он выделит сам буфер и вернет в size количество выделенных байтов.

Как я могу объявить и вызвать эту функцию из приложения C # (избегая unsafe если возможно) в обоих сценариях (прохождение уже выделенного буфера или разрешение на его выделение для меня)?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Я думаю, я решил использовать это решение:

...
UInt32 len;
IntPtr ppData = IntPtr.Zero;

fillBuffer( ref ppData, out len );
...

И объявив функцию следующим образом:

 [DllImport( "mylib.dll", CallingConvention = CallingConvention.Cdecl )]
 static extern void fillBuffer( ref IntPtr ppData,out UInt32 size );

Спасибо

0 голосов
/ 23 февраля 2019

Вы не можете вызывать функции C без небезопасного контекста.Это просто невозможно.Нельзя использовать небезопасные указатели в управляемом контексте, если вы не заявили об этом.

...