.net CallbackOnCollectedDelegate 垃圾回收问题。
错误信息:
对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
最近在写一段程序,一开始运行正常,但执行几次后就抛出错误信息。。插了MSDN,
解决办法是把委托赋值给类的成员;
例如:
原来的委托:
public delegate int HookProc(int Code, Int32 wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
调用SetWindowsHookEx:
SetWindowsHookEx(13,New HookProc(xxx) , Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
运行几次后就会出现错误,HookProc被回收了,
解决办法:
public class test
{
..........
private static HookProc hookproc;
..........
hookproc=new HookProc(xxx);
SetWindowsHookEx(13,hookproc , Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
}
这样就不会抛出异常。。。