Re[5]: Какие методы логирования из С либы знаете?
От: kov_serg Россия  
Дата: 08.01.26 09:26
Оценка: 8 (1)
Здравствуйте, Hоmunculus, Вы писали:

H>Здравствуйте, kov_serg, Вы писали:


H>Ну это и есть коллбек.

H>Кстати, есть пример как такое из шарпа в либу подсунуть?

Примерно так:
using System;
using System.Text;
using System.Runtime.InteropServices;

class Program {
    public delegate void func_t(IntPtr ctx,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] data,int size);

    [DllImport("lib.dll",CallingConvention=CallingConvention.Cdecl)]
    public static extern int func(func_t cb, IntPtr ctx);
    static Program my(IntPtr ctx) { return GCHandle.FromIntPtr(ctx).Target as Program; }
    static void _cb(IntPtr ctx, byte[] data, int size) { my(ctx).cb( Encoding.UTF8.GetString(data) ); }
    
    void cb(string data) {
        Console.WriteLine(data);
    }

    static void Main(string[] args) {
        Program p = new Program();
        
        GCHandle pctx=GCHandle.Alloc(p, GCHandleType.Normal);
        int r = func(new func_t(_cb), GCHandle.ToIntPtr(pctx) );
        pctx.Free();
    }
}
extern "C" __declspec(dllexport) int func( void (*write)(void* ctx,char* data,int size), void* ctx) {
  if (write) write(ctx,"hello",5);
  return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.