当前位置:编程学习 > C#/ASP.NET >>

委托的问题,提示已经被回收?

前几天测试还好好的,今天突然出现了这个问题。。。该如何解决?
问题描述:
对“USB2ParallelPort!USB2ParallelPort.no+mPCH341_NOTIFY_ROUTINEDelegate::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

程序部分:
(1),公共模块变量里面定义的几个函数
‘引入一个DLL,用来检查设备是否插上
   Declare Function CH341SetDeviceNotify Lib "CH341DLL.DLL" (ByVal iIndex As Integer, ByRef iDeviceID As String, ByVal iNotifyRoutine As no.mPCH341_NOTIFY_ROUTINEDelegate) As Boolean
   
    ' '' 设备事件通知回调程序' 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
    Delegate Function mPCH341_NOTIFY_ROUTINEDelegate(ByVal iEventStatus As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal iEventStatus As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lVal As Integer) As Integer
    Public Function mPCH341_NOTIFY_ROUTINE(ByVal iEventStatus As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

        PostMessage(frmMain.CH341_NOTIFY_ROUTINE.Handle.ToInt32, WM_KEYUP, iEventStatus, 0) '将接收到的插拔事件值发到插拔处理程序中

      
    End Function

(2)窗体程序里面一个按钮来模仿设备的插拔事件,然后调用公共模块里面的委托,通过委托来控制窗体的显示.
    '》》》》》》》》》--这个按钮的事件用来模拟设备插拔的事件
    Private Sub CH341_NOTIFY_ROUTINE_KeyUp(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyEventArgs) Handles CH341_NOTIFY_ROUTINE.KeyUp
        Dim KeyCode As Short = eventArgs.KeyCode
        Dim Shift As Short = eventArgs.KeyData \ &H10000 '设备插拔通知处理程序
        Dim iEventStatus As Integer
        iEventStatus = KeyCode '插拔事件
        If (iEventStatus = CH341_DEVICE_ARRIVAL) Then ' 设备插入事件,已经插入
            If (CH341OpenDevice(mIndex) = INVALID_HANDLE_VALUE) Then
                MsgBox("打开设备失败!", MsgBoxResult.Ok, "CH341PAR")
                mOpen = False
            Else
                mOpen = True '打开成功
            End If
        ElseIf (iEventStatus = CH341_DEVICE_REMOVE) Then  ' 设备拔出事件,已经拔出
            CH341CloseDevice((mIndex))
            mOpen = False
        End If
        enablebtn((mOpen)) '设备打开,按钮可用,设备没打开,按钮禁用
    End Sub
--------------------编程问答-------------------- 你用 GCHandle.Alloc 为这个委托建立一个句柄,这样GC就不会回收这个委托了! --------------------编程问答-------------------- 楼上的正解 --------------------编程问答-------------------- 偶菜菜的问一句,怎么为这个委托建立句柄呢?
该如何获得委托的句柄? --------------------编程问答-------------------- 顶噶 --------------------编程问答-------------------- 没人再帮俺么? --------------------编程问答-------------------- 同问??????????????????????? --------------------编程问答-------------------- 定义一个静态的全局委托变量就可以了,不要使用局部变量
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,