Здравствуйте, tapatoon, Вы писали:
T>T>[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
T>public delegate void Callback([MarshalAs(UnmanagedType.LPUTF8Str)] string str);
T>[DllImport("lib", CallingConvention = CallingConvention.Cdecl)]
T>public static extern void Func(Callback dataReceiver);
T>
T>T>using Callback = void (*)(const char* str);
T>void Func(Callback dataReceiver)
T>{
T> dataReceiver(toUtf8(...));
T>}
T>
T>Тут главное сделать удобные врапперы над всем этим, дабы каждый вызов функции не превращался в писанину на несколько строк
Если c# может jit-тить callback-и то остальным нужен указатель на контеркст. Или придётся велосипедить переходники на другой стороне.
Удобство можно добиться обычным врапером. И будет вообще не видно что под капотом. Короче компромис есть всегда. И конкретная реализация зависит от требований к задаче.
Но вызов с void fn(void* ctx,const char* data,int size); и меет более общий характер нежели void fn(const char* cstr_utf8); хотя одно всегда можно привести к другому, но это требует дополнительных усилий
по описанию/документированию происходящего и дополнительным накладным расходам для всех сторон.