C#回调函数内存被回收问题

我使用CH372与C#通讯,其中CH372DLL需要回调函数,编译的时候没有问题,但是运行的时候总是提示这个,网上查了很多方法都没解决

字数限制,只贴出了主要部分,
程序如下:namespace USBtoIIC{ static public class CH375 {
[DllImport("CH375DLL.DLL ")] static extern bool CH375SetIntRoutine(int iIndex, deleSet iIntRoutine);
[DllImport("CH375DLL.DLL ")] static extern bool CH375SetDeviceNotify(int iIndex, string iDeviceID, deleSet Workingref, int[] iBuf);
public static bool CH375_SetIntRoutine(int iIndex, deleSet iIntRoutine) { return CH375SetIntRoutine(iIndex, iIntRoutine); }
public static bool CH375_SetDeviceNotify(int iIndex, string iDeviceID, deleSet Workingref, int[] iBuf) { return CH375SetDeviceNotify(iIndex, iDeviceID, Workingref, iBuf); }

public delegate void deleSet(IntPtr iBuffer); public static int[] pBuf = new int[64];
public static void CH375_Init() { CH375SetIntRoutine(0, IntRoutine); CH375SetDeviceNotify(0, null, DeviceNotify, pBuf); }
public static void IntRoutine(IntPtr iBuffer)//被回调的函数1 { MessageBox.Show("11"); }
public static void DeviceNotify(IntPtr iBuffer)//被回调的函数2 { MessageBox.Show("22"); } }}

不要定义成静态类,new个全局对象出来用。
也许可以。追问

最初就是你说的那样写的 之后不行才写成这样 还是不行

追答

//是由于回调函数指针(委托)系统回收
NotifyCallBack mynotifycallback = new NotifyCallBack(NOTIFY_ROUTINE);
ch375.SetDeviceNotify(mynotifycallback))
改为
NotifyCallBack mynotifycallback = new NotifyCallBack(NOTIFY_ROUTINE);
GC.Collect();
GC.WaitForPendingFinalizers(); //防止委托函数被系统回收
ch375.SetDeviceNotify(mynotifycallback))

网搜的,试下 ^^

追问

按照你的方法试了一下 结果还是一样

温馨提示:内容为网友见解,仅供参考
无其他回答

C# 回调函数会出现错误的问题
这是因为你的回调委托作用域问题。在回调时,委托已经被回收了 所谓成员变量:class test{ public delegate a;public void foo(){ private delegate b;} } 像这种情况,b委托的作用域只在foo()函数里面,如果你让b被非托管代码回调,当foo执行完后,非托管代码回调时很可能b已被回收了。所以出现这...

可以通俗的讲下C# 构造函数 析构函数 和回调函数 么?
~Student(){}这个就是析构函数 注意前面有一个 波浪线 作用:析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。3.回调函数 C# 里面这个东西一般指某个委托.其实也可以是接口.delegate void WorkDone();void Working(WorkDon...

请教C#回调函数的调用问题
其实在C#语言中,如果不考虑unsafe编程的情况下,C#已经不存在指针了!但是有一种情况很特殊——我们需要实现将一个成员方法(函数是不规则的称呼,面向对象中只有成员方法,没有函数的概念了)做为一个参数传入到另一个方法。当然,在C\/CPP中我们存在指针,把函数(或成员方法,面向过程语言或支持面向过...

c#-回调callback是什么原理,机制? C#
方法(参数1,参数2,回调函数)就是把 参数1,和参数2传给 回调函数委托是对函数指针的安全封装以前的函数指针是 不安全的原因就是 方法(参数1,参数2,回调函数) 也许回调函数只接受一个参数,或参数类型不同~而.net的委托 指定了回调函数的签名 于是他安全了我是看C#的高级编程 中多线程那章才懂的然...

求助,关于回调函数中ref byte 转换成 byte的问题
转换成c#的函数如下 C# code?1 2 public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, ref byte pBuffer, uint dwBufSize, uint dwUser);public static extern bool NET_DVR_SetPlayDataCallBack(int lPlayHandle,PlayDataCallBack x,uint dwUser);现在需要在回调函数 Play...

如何在C#写的dll 里调用回调函数?
2.使用TCP通信,监听端口获取消息,这是跨平台程序通信最常用也是最正统的方法。一般是跨操作系统编程常用的,比如windows和linux ubuntu server程序进行交互。你所述情况虽然不算跨操作系统通信,但是也是跨平台了。而且想想就知道C++作为先出现的语言而且是编译型语言,调用C#托管区的函数还要设回调,其难度...

求助:C# 调用C++的dll的回调函数的结构体数组的问题,为什么只得到数组的...
C# 调用:using System;using System.Text;using System.Runtime.InteropServices;namespace IntPtrTest { class Program { static void Main(string[] args){ TestD t = new TestD(Test);Caller(t);} [StructLayout(LayoutKind.Sequential)]public struct CardEvent { public uint CardNo;public Int...

c#调用sdk时,求教回调函数如何处理
回调函数用.NET中的委托处理 比如SDK中有个查找所有窗口的函数:[DllImport("user32")]private static extern bool EnumWindows(DelegateEnumWindow ew, int lParam);上面的参数ew就是一个委托(回调函数),再看这个参数的声明:delegate bool DelegateEnumWindow(IntPtr hWnd, int lParam);再看调用:Delegate...

C#回调函数什么意思
C# 里面这个东西一般指某个委托.其实也可以是接口.delegate void WorkDone();void Working(WorkDone callBack){ \/\/Working code.\/\/当工作完成的时候执行这个委托.callBack();} void WorkDoneHandler(){ \/\/Do something other.} void Do(){ WorkDone callBack = new WorkDone(WorkDoneHandler);Wo...

c#调用sdk时,求教回调函数如何处理
System.Runtime.InteropSerivces.Marshal类中有相关方法,能返回委托相对应的指针:IntPtr GetFunctionPointerForDelegate<T>(T targetDelegate);通过这个函数就能获取委托相对应的指针,再把指针传递给 SDK 函数即可。

相似回答