元元娱

 找回密码
 立即注册
搜索
查看: 26|回复: 0

.net CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩

[复制链接]

30

主题

30

帖子

3000万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
30000191
发表于 2020-9-16 12:03:09 | 显示全部楼层 |阅读模式

最近在研究C#调用C++ DLL时,使用回调函数时程序执行几次后出现错误:对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

经过网上查找发现是使用委托时的问题,解决方法:委托赋值给类的成员。

原来:

       //回调
        [DllImport("HDCamGrabFace.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern void HD_CAMERA_SetCallBack(HDCam_CallBack pCallback, IntPtr pContext);

        //
        public delegate void HDCam_CallBack(IntPtr pContext, uint dwMsg, uint dwParam1, uint dwParam2, uint dwParam3, uint dwParam4);


         public void CallBack(IntPtr pContext, uint dwMsg, uint dwParam1, uint dwParam2, uint dwParam3, uint dwParam4)
        {}


        //调用:

        HD_CAMERA_SetCallBack(CallBack, pthis.Handle);


修改后:

       //回调
        [DllImport("HDCamGrabFace.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern void HD_CAMERA_SetCallBack(HDCam_CallBack pCallback, IntPtr pContext);

        //
        public delegate void HDCam_CallBack(IntPtr pContext, uint dwMsg, uint dwParam1, uint dwParam2, uint dwParam3, uint dwParam4);


       // 在类中定义委托变量

        public static HDCam_CallBack hd_call_delegate = null;


        public void CallBack(IntPtr pContext, uint dwMsg, uint dwParam1, uint dwParam2, uint dwParam3, uint dwParam4)
        {}

      //调用:

     hd_call_delegate = new HDCam_CallBack(CallBack);
     HD_CAMERA_SetCallBack(hd_call_delegate, pthis.Handle);


-----来源csdn


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|元元娱 ( 冀ICP备15001683号

GMT+8, 2020-9-24 19:42 , Processed in 0.107198 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表