C# 错误:检测到CallbackOnCollectedDelegate

C# 错误:检测到CallbackOnCollectedDelegate,c#,delegates,callback,C#,Delegates,Callback,我目前正在处理一个第三方dll,当调用委托OnReceive时,随机出现以下错误: 检测到CallbackOnCollectedDelegate 我读到,GC.Collect()可以用static解决问题,但也不是as,我有几个小时的时间尝试各种方法CallbackOnCollectedDelegate获取错误,请帮助 namespace Interfaz { class TMPDlg: { public CTMIF m_objTMPInterface;

我目前正在处理一个第三方dll,当调用委托
OnReceive
时,随机出现以下错误:

检测到CallbackOnCollectedDelegate

我读到,
GC.Collect()
可以用static解决问题,但也不是as,我有几个小时的时间尝试各种方法
CallbackOnCollectedDelegate
获取错误,请帮助

namespace Interfaz
{
    class TMPDlg:
    {
        public CTMIF m_objTMPInterface;

        public uint m_dwLocalIP;
        public ushort m_nPort;
        public byte m_nSubNet;
        public uint m_nRadioID;
        public uint m_nIndex;
        public uint m_dwMobileID;
        public int nLength;
        public string mensaje_destino;
        public string mensaje_recibido;        


        public TMPDlg()
        {
            m_objTMPInterface = null;
        }

        unsafe public void OnReceive(ushort wOpcode, System.IntPtr pbPayload, uint dwSize, uint dwLocalIP)
          {
              TMReceive(wOpcode, (byte*)pbPayload, dwSize, dwLocalIP);
          }

        unsafe public void TMReceive(ushort wOpcode, byte * pbPayload, uint dwSize, uint dwLocalIP)
          {
             // Some Work....
          }

        public void Send_PrivateMsg(string textBoxMensaje, string labelID)
        {
            m_nRadioID = uint.Parse(labelID);
            mensaje_destino = textBoxMensaje;
            nLength = textBoxMensaje.Length;

            m_objTMPInterface.SendPrivateMsg(m_nRadioID, mensaje_destino, nLength, 0);

        }

        public void conect_master(ushort port, string ip)
        {
            m_objTMPInterface = new CTMIF();
            m_dwLocalIP = (uint)IPAddressToNumber(ip);

            ADKCALLBACK myOnReceive = new ADKCALLBACK(OnReceive);
            m_objTMPInterface.SetCallBackFn(myOnReceive);

        //m_objTMPInterface.SetCallBackFn(OnReceive);        
            m_objTMPInterface.OpenSocket(m_dwLocalIP, port, m_dwMobileID, 10)<

        }
namespace Interfaz
{
TMPDlg类:
{
公共CTMIF m_对象界面;
公共单位m_DWP;
公共卫生服务中心;
公共字节m_nSubNet;
公共单位m_nRadioID;
公共单位指数;
公共单位m_Dmobileid;
公共国际长度;
公共字符串mensaje_destino;
公共字符串mensaje_recibido;
公共TMPDlg()
{
m_objtminterface=null;
}
接收时不安全的公共无效(ushort wOpcode、System.IntPtr pbPayload、uint dwSize、uint DWP)
{
TMReceive(wOpcode,(字节*)pbPayload、dwSize、dwp);
}
不安全的公共无效TMReceive(ushort wOpcode,字节*pbPayload,uint dwSize,uint DWP)
{
//一些工作。。。。
}
public void Send_PrivateMsg(字符串textBoxMensaje,字符串labelID)
{
m_nRadioID=uint.Parse(labelID);
mensaje_destino=textBoxMensaje;
NLENGHT=文本框mensaje.长度;
m_objtminterface.sendprivatemg(m_nRadioID,mensaje_destino,nLength,0);
}
公共无效连接主机(ushort端口,字符串ip)
{
m_objtminterface=new CTMIF();
m_dwLocalIP=(uint)ip地址编号(ip);
ADKCALLBACK myOnReceive=新的ADKCALLBACK(OnReceive);
m_objtminterface.SetCallBackFn(myOnReceive);
//m_objtminterface.SetCallBackFn(OnReceive);
OpenSocket(m_dwLocalIP,port,m_dwMobileID,10)<
}

大概这部分就是问题所在

ADKCALLBACK myOnReceive = new ADKCALLBACK(OnReceive);
m_objTMPInterface.SetCallBackFn(myOnReceive);
如果您有一个类型为
ADKCALLBACK
的实例变量,那么只要您的实例在回调函数执行之前(或执行期间)没有被垃圾收集,您就可以了。是什么控制了实例的生存期

class TMPDlg
{
    // Instance variable to protect from garbage collection
    private readonly ADKCALLBACK receiveCallback;

    public TMPDlg()
    {
        receiveCallback = myOnReceive;
    }

    ...

    public void ConnectMaster(ushort port, string ip)
    {
        ...
        m_objTMPInterface.SetCallBackFn(receiveCallback);
        ...
    }
}

(顺便说一句,您的命名可以显著改进,您应该避免使用公共字段。)

我将进行测试,非常感谢您抽出时间提供帮助。我对简短性发表了评论:)