я создаю адаптер .NET для следующего C API:Native C строка списка слабая ссылка на C#
void GetStringList(const char *** listOut, rsize_t * listCountOut);
Я хочу # адаптер C, который выглядит как:
[DllImport("api.dll", CallingConvention = CallingConvention.Cdecl)]
static extern
void GetStringList(
out string[] listOut,
out int listCountOut
);
Это Безразлично» t, потому что маршаллер не знает, что длина внешнего списка обеспечивается вторым параметром. Кроме того, я не могу настроить IntPtr, потому что длина не известна, пока функция не вернется.
Я могу решить это с помощью небезопасных.
Есть ли лучший способ без опасностей?
«небезопасный», кажется, лучше всего подходит здесь, «лучший способ». Что значит «лучше?» –
«лучше» == полностью управляемое решение –
char *** - это переменная out, которая принимает char **, например char * [] или PSTR []. Это происходит там, где C-код владеет памятью и предлагает слабую ссылку на список строк. –