我正在开发一个需要调用 C++ dll 的 C# gui 应用程序。似乎所有的电话都在工作,除了一个特别的电话。从 C++ 头文件中,函数和回调签名如下:
typedef void (__stdcall *LPFNDLL_RECEIVE_CALLBACK)(CANMsg*);
USBCANPLUS_API
CAN_STATUS __stdcall canplus_setReceiveCallBack(
CANHANDLE handle,
LPFNDLL_RECEIVE_CALLBACK cbfn
);
根据读数,我已经设置和内部类包装调用,如下所示:
[DllImport("USBCanPlusDllF.dll")]
public static extern int canplus_setReceiveCallBack(int handle, CallbackDelegate callback);
[UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
public delegate void CallbackDelegate(ref CANMsg msg);
并用作:
private static void callback(ref EASYSYNC.CANMsg msg)
{
Debug.Print(msg.id + ":" + msg.timestamp + ":" + msg.flags + ":" + msg.len + ":" + msg.data);
}
static EASYSYNC.CallbackDelegate del = new EASYSYNC.CallbackDelegate(callback);
private void button1_Click(object sender, EventArgs e)
{
int handle = EASYSYNC.canplus_Open(IntPtr.Zero, "1000", IntPtr.Zero, IntPtr.Zero, 0);
if(handle > 0)
{
int result = EASYSYNC.canplus_setReceiveCallBack(handle, del);
}
}
我知道在 C# 中处理 C++ 回调很棘手,并且已经阅读了一些关于该主题的内容,因此我有上面的代码。我的问题是我的代码遇到了 int result = .... 行整个程序出去吃午饭,这表明我在处理回调时可能仍然做错了什么。任何人都可以建议吗?