我必须注册一个用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] 删除。
我来说两句