C#Marshalled Callbacks

时间:2011-03-09 18:34:09

标签: c# .net marshalling

我正在尝试使用结构中的Marshall 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 个答案:

答案 0 :(得分:1)

与代表打交道的一切都是正确的。我在示例中略微简化了senario。

public static extern int SetCallbacks(Callbacks callBack); 

实际上是

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

字符串数组末尾有很多尾随0。这使得回调结构全为空。我放弃了尝试以正确的方式编组字符串[]并使其成为一个Intptr并且一切都开始工作。

答案 1 :(得分:0)

与昨天提出的这个问题非常相似......

PInvoke C#: Function takes pointer to function as argument