繁体   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