我在 Native C dll 中有以下代码。
typedef void CallbackType( INT32 param1, INT32 param2 );
NATIVE_API void RegisterEventCallBack(CallbackType *callBackFunction);
//INT32 is defined as below:
typedef signed int INT32, *PINT32;
我必须从我的 C# 代码中调用此方法。在遵循stackflow提供的一些解决方案之后,我尝试了这个:
代表声明:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallbackType(Int32 param1, Int32 param2);
方法导入声明:
[DllImport("EtIPAdapter.dll")]
public static extern void RegisterEventCallBack([MarshalAs(UnmanagedType.FunctionPtr)]CallbackType callbackFunc);
来电:
RegisterEventCallBack(ReceivedData);
private static void ReceivedData(Int32 param1, Int32 param2)
{
//Do something
}
但这不起作用,我收到以下错误:
对 PInvoke 函数“RegisterEventCallBack”的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我还尝试通过传递我使用的函数指针GetFunctionPointerFromDelegate(ReceivedDataDelegate)
。但这也会导致同样的错误。
错误指出签名不匹配,但我没有看到任何明显的签名不匹配。请帮忙。