Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1321895
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: WINDOWS

2011-12-13 11:47:09

错误信息:

             对“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);

}

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

====

http://kb.cnblogs.com/a/1497749/

---------------------------------------------------------------------------------------------

C# 回调函数会出现错误: 对“XX”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。网上说解决方法是:如果非托管代码需要多次调用托管代码中的回调,请将委托的引用保存为成员变量。请问什么样的变量是成员变量,怎么声明
     
最佳答案
这是因为你的回调委托作用域问题。在回调时,委托已经被回收了
所谓成员变量:
class test{
  public delegate a;
  public void foo(){
   private delegate b;
  }
}

像这种情况,b委托的作用域只在foo()函数里面,如果你让b被非托管代码回调,当foo执行完后,非托管代码回调时很可能b已被回收了。所以出现这个错。
a委托是test类的成员变量,它是可以一直保持的,除非你对test进行了析构。
也可以使用static的变量。
也就是说,尽量扩大你的委托的作用域,保证在回调是它不会被自动回收就行了。
====
 
---------------------------------------------------------------------------------------------
检测到 CallbackOnCollectedDelegate
Message: 对“System.Windows.Forms!System.Windows.Forms.NativeMethods+WndProc::Invoke”
类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,
托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
----
bud_zhao回复于15日08点02分  传给非托管代码时, 委托定义成全局,不要定义在方法里
====
阅读(6682) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~