• C# OpenCVSharp使用SetMouseCallback设置回调方法,报错"向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。"


    一、描述问题

    非托管代码调用托管应用程序的委托的时候,经常会报错“托管调试助手 "CallbackOnCollectedDelegate"   Message=托管调试助手 "CallbackOnCollectedDelegate":“对“OpenCvSharp!OpenCvSharp.CvMouseCallback::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。”

    二、原因分析

    GC将局部变量和局部变量引用的委托销毁了,当托管代码去访问委托的时候就会报以上错误。

    三、解决方法

    使用成员变量(比如字段)将需要委托执行的方法放到里面,防止GC回收,而不是将需要执行的方法放到局部变量中。

    四、示例说明

    错误代码:

    调用SetMouseCallback设置回调方法,运行会报以上错误:

    1         private void button15_Click(object sender, EventArgs e)
    2         {
    3             Mat mat = GetMat();
    4             Cv2.SetMouseCallback("输入图像", GetRGBCallbackMethod);
    5         }

    正确代码:

    使用字段GetRGBCvMouseCallback来订阅GetRGBCallbackMethod:

                            private CvMouseCallback GetRGBCvMouseCallback;

                             GetRGBCvMouseCallback=new CvMouseCallback(GetRGBCallbackMethod);

                            Cv2.SetMouseCallback("输入图像", GetRGBCvMouseCallback);

    原因分析:

    因为成员变量CvMouseCallback 不会像局部变量一样,作用域很小,方法执行完就会被GC回收

  • 相关阅读:
    微信小程序-默认选中状态
    微信小程序-翻页(优化)
    openLayers3 中实现多个Overlay
    2月的最后一天
    2月27日
    杂记--写于狂风乱作的夜晚
    安装部署程序
    superMap Object 属性查看的一点代码
    坚持不懈的学习吧,少年
    Windows API中几个函数的总结
  • 原文地址:https://www.cnblogs.com/cherish836138981/p/11989117.html
Copyright © 2020-2023  润新知