C # Marshalled Callbacks - PullRequest
       21

C # Marshalled Callbacks

3 голосов
/ 09 марта 2011

Я пытаюсь Маршаллу c перезвонить в структуре.Я почти уверен, что у меня все правильно, но при использовании моего примера C # я не получаю события, при использовании c ++ я получаю события.

Вот C #

class Program
{
    [DllImport("Some.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern int SetCallbacks(Callbacks callBack);


    static Callbacks Callback = new Callbacks { DataArrived = DataArrived, SendFailure = SendFailure };
    static void Main(string[] args)
    {
        SetCallbacks(Callback);

        Console.ReadLine();
    }

    static void DataArrived(uint id, IntPtr data)
    {

    }

    static void SendFailure(uint id, uint id2, IntPtr data)
    {

    }
}



[StructLayout(LayoutKind.Sequential)]
public struct Callbacks
{
    public DataArrived DataArrived;
    public SendFailure SendFailure;
}

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void DataArrived(uint id,   IntPtr data);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void SendFailure(uint id, uint id2, IntPtr ulpData);

Этоэто из заголовочного файла C.

struct callBacks
{
    void (*dataArriveNotif) (unsigned int,    void*);
    void (*sendFailureNotif) (unsigned int, unsigned int, void*);
}

int SetCallbacks(callBacks callBacks);

Вот рабочий c ++.

struct callBacks;
callbacks.dataArriveNotif = &dataArriveNotif;
callbacks.sendFailureNotif = &sendFailureNotif;
SetCallbacks(callBacks);

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Все, что касалось делегата, было действительно правильным. Я немного упростил senario в примере.

public static extern int SetCallbacks(Callbacks callBack); 

было на самом деле

public static extern int SetCallbacks(String[] array, Callbacks callBack);

Массив строк имел множество конечных 0 в конце. Что сделало функцию обратного вызова структурой всех нулей. Я прекратил попытки правильно упорядочить строку [] и просто сделал ее Intptr, и все начало работать.

0 голосов
/ 09 марта 2011
...