使用C#在非托管代码中将委托传递给回调函数

朗加拉吉

我必须注册一个用c#的非托管代码编写的回调函数。我写了以下代码:

//Declaration for c++ code
[DllImport("sdk.dll")]
public static extern void sdkSetDequeueCallback(DequeueCallback cbfunc);
//call back delegate
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void DequeueCallback(OutData data);
GCHandle dequeueCallbackPinHandle;
 Deque = new DequeueCallback(CallBackMethod);
{//try out
// Getting error following line (1 line) , Error : Object contains non-primitive or non-blittable data.
 //dequeueCallbackPinHandle = GCHandle.Alloc(Deque, GCHandleType.Pinned);

 //GC.KeepAlive(Deque);
}
 SetDequeueCallback(Deque);
//Call back method in c#
 public async void CallBackMethod(OutData data)
        {}

上面的代码在没有tryout块的情况下可以正常工作,但是问题是应用程序在随机的一段时间(有时30分钟,1小时,8小时等)后停止运行。在try..catch块中未检测到错误,但从Windows事件日志(应用程序)获取以下NullReferenceException错误:说明:由于未处理的异常,进程已终止。异常信息:System.NullReferenceException。我认为可能是问题,但是试用代码无法正常工作。请帮我解决问题

鲍里斯·拉辛

只要在C ++中使用了回调,就需要确保您的'Deque'引用是有效的,并且不会被覆盖。只要使用了相应的C ++回调,您就有责任使委托C#对象保持活动状态。

更好的是,只需使用Scapix Language Bridge,它就会完全自动生成C ++到C#的绑定(包括回调)。免责声明:我是Scapix Language Bridge的作者

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章