2012-03-26 3 views
1

Я хочу передать делегат на C из C#, как показано ниже.передать делегат от C# до c как параметр функции

// C# код

Main() 
{ 
    //something 

    public delegate int watch(int BytesLeft, IntPtr response); 

    watch test1 = fun1; 

    SendImage(FileArray,Length,test1); 

    int fun1(int BytesLeft, IntPtr response) 
    { 
     //unmarshall response 
    } 
} 

C код показан ниже код

// C

SendImage(int data, int len, <function_ptr>test) 
{ 
    //something 
    unsigned char ptr[10]; 
    ptrByte = &ptr[0]; 
    //something 
    for(i=0;i<num_of_packet,i++) 
    { 
     TLayer();//something:some call 
     int check=0; 
     check = test(bytes_left, ptrByte); 
    } 
    //something 
} 

Как я могу это сделать? Пожалуйста помоги.

ответ

0

Вы должны пометить делегата UnmanagedFunctionPointerAttribute с тем же вызовом, что и другие подписи метода P/Invoke.

C# затем обрабатывает маршалинг указателя функции автоматически, то P/Invoke подпись SendImage будет выглядеть следующим образом (предполагается, что ваш тип делегата таким же, как в вашем примере, watch):

[DllImport(...)] 
public extern void SendImage(int data, int len, watch test); 

Также , ваше объявление типа делегата будет выглядеть так:

[UnmanagedFunctionPointer(...)] 
public delegate int watch(int BytesLeft, byte response); 
+0

Не нужно использовать ** Marshal.GetFunctionPointerForDelegate **? – SHRI

+0

Извините, большую часть времени, когда я выполняю interop, указатели функций являются частью структур, которые сортируются взад и вперед. Оказывается, вам действительно нужно сделать его «IntPtr» и вызвать «Marshal.GetFunctionPointerForDelegate». Я исправлю ответ для этого. –

+0

Не исправляйте это, маркшаллер pinvoke уже делает это. Ваш код сейчас не компилируется, не может передать IntPtr. –

Смежные вопросы