我有一些麻烦,从C#传递回调函数到C++非托管DLL。当运行程序时,DLL接收NULL而不是回调。C#/ C++回调传递为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++函数definitly正确地工作,因为我已经从C++控制台应用程序测试它,并且它工作正常ctly。在C#中,我可以通过Marshal.GetFunctionPointer(Delegate d)
获取回调代理的指针,但是当我在进入StreamData函数的位置点过程序时,指针在DLL内部变为NULL。调用约定在DLL和C#委托中是一致的。
我错过了一些非常基本的东西吗?是否有人知道纠正问题的方法?
UPDATE
如果unsigned long Points
参数从DLL和C#都删除,然后功能工作正常,否则回调为NULL。
数组不是问题,我检查了这个。 – Alex 2014-12-02 15:22:16