【发布时间】:2014-12-02 14:32:58
【问题描述】:
我在将回调函数从 C# 传递到 C++ 非托管 DLL 时遇到了一些问题。运行程序时,DLL 接收 NULL 而不是回调。
回调函数定义为
typedef void(__cdecl *CallbackFunction)();
C++ 函数定义为
__declspec(dllexport) void __cdecl StreamData(unsigned char *Buffer, unsigned int BufferSize, unsigned long Points,
unsigned short AveragingPower, CallbackFunction BufferUpdated);
C# 回调和函数委托定义为
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void BufferUpdatedCallback();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void StreamDataDelegate(byte[] Buffer, uint BufferSize, ulong Points,
ushort AveragingPower, BufferUpdatedCallback BufferUpdated);
C++ 函数确实可以正常工作,因为我已经从 C++ 控制台应用程序对其进行了测试,并且它可以正常工作。在 C# 中,我可以通过Marshal.GetFunctionPointer(Delegate d) 获取回调委托的指针,但是当我在程序进入 StreamData 函数时单步执行程序时,指针在 DLL 中变为 NULL。 DLL 和 C# 委托的调用约定是一致的。
我错过了一些非常基本的东西吗?有人知道解决问题的方法吗?
更新
如果 unsigned long Points 参数从 DLL 和 C# 中删除,则函数正常工作,否则回调为 NULL。
【问题讨论】: