我正在尝试使用结构中的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);
答案 0 :(得分:1)
与代表打交道的一切都是正确的。我在示例中略微简化了senario。
public static extern int SetCallbacks(Callbacks callBack);
实际上是
public static extern int SetCallbacks(String[] array, Callbacks callBack);
字符串数组末尾有很多尾随0。这使得回调结构全为空。我放弃了尝试以正确的方式编组字符串[]并使其成为一个Intptr并且一切都开始工作。
答案 1 :(得分:0)
与昨天提出的这个问题非常相似......