簡體   English   中英

調用C ++函數,指向C#中的函數作為參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM