передать делегат из c # в c в качестве параметра функции - PullRequest
1 голос
/ 26 марта 2012

Я хочу передать делегату 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
}

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

1 Ответ

0 голосов
/ 26 марта 2012

Вы должны пометить делегата 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);
...