zoukankan      html  css  js  c++  java
  • .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);

    }

    这样就不会抛出异常。。。

     

     

  • 相关阅读:
    MySQL之pymysql模块
    MySQL 之 索引原理与慢查询优化
    MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
    MySql之数据操作
    MySQL之多表查询
    MySQL之单表查询
    MySQL之表的约束
    MySQL之表操作
    MySQL之表的数据类型
    pycharm 2016 注册(pycharm-professional-2016.3.2)
  • 原文地址:https://www.cnblogs.com/fourleg/p/1497749.html
Copyright © 2011-2022 走看看