[英]Calling C++ function with pointer to function in C# as parameter
我在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)
得到的函數指針。 但這也會導致同樣的錯誤。
錯誤指出簽名不匹配,但我沒有看到任何明顯的簽名不匹配。 請幫忙。
執行DLLImport時請檢查調用約定 - 默認為Winapi / StdCall。
此外,必須在應用程序的生命周期內在托管代碼中保留對委托的引用,因為垃圾收集器會在一段時間后刪除您的委托,因為垃圾收集器只能計算托管代碼中的引用。 我通常將對委托的引用保留為設置委托的類的靜態屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.