- 今天跑程序出现一个问题
检测到 CallbackOnCollectedDelegate Message: 对“Common!Common.BarCodeHook+HookProc::Invoke”类型的已垃圾回收委托进行了回调。 这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保 持活动状态,直到确信不会再次调用它们。
hookproc = new HookProc(KeyboardHookProc); //WH_KEYBOARD_LL = 13 hKeyboardHook = SetWindowsHookEx(13, hookproc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
问题出现在上面的代码中,hookproc回调在调用SetWindowsHookEx之前被回收了,所以报了上面的错误。
解决方法是利用GC.KeepAlive()防止方法被回收。
代码如下:
public bool Start()
{
if (hKeyboardHook == 0)
{
hookproc = new HookProc(KeyboardHookProc);
//WH_KEYBOARD_LL = 13
hKeyboardHook = SetWindowsHookEx(13, hookproc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
GC.KeepAlive(hookproc);//增加一个保持不被垃圾回收的机制
}
return (hKeyboardHook != 0);
}