private  void RefreshDeceile_Click(object sender, EventArgs e)
{
            
      if (!bInitIPAdminTool)
      {
          try
          {
              int hr = lingshi_IPAdminTool.InitSocket2(1);
              if (hr <= 0)
              {
                  return;
              }
              lingshi_IPAdminTool.Func callback = new lingshi_IPAdminTool.Func(AddClientCallback);
              lingshi_IPAdminTool.SetCallback(callback);//回调函数可以正确执行一次,
              bInitIPAdminTool = true;
           }
           catch(Exception er)
           {
           }  
        }
        lingshi_IPAdminTool.Refresh();
 }private  void AddClientCallback(lingshi_IPAdminTool.Clientinfo _info)
{
    //回调函数可以正确执行一次,然后程序自动退出}

解决方案 »

  1.   

    楼主,加上try{}catch{},设置断点,单步调试,看看是什么异常
      

  2.   

    你是怎么确定没有异常,  catch(Exception er)
      {  //断点
      }  private void AddClientCallback(lingshi_IPAdminTool.Clientinfo _info)
    {
      try
      {
      }
    catch(Exception er)
      {    //断点
      }   
    }
      

  3.   

    我设置断点单步调试,什么错都没有,lingshi_IPAdminTool.Clientinfo _info已经得到值,private void AddClientCallback(lingshi_IPAdminTool.Clientinfo _info)
    {}执行完,程序就自动退出
      

  4.   

    这个情况我以前遇到过,原因最终也没有确定,当初推断是因为C#的回收机制造成的。
    当C++第一次调用完你的回调函数后,C#这个时候已经把C++中定义的变量也就是你的那个结构体已经释放了,
    所以C++第二次调用的时候,发现结构体变量已经没有了,当然会报错。
    处理方法如下:
    //定义委托的时候,不要使用结构体,也就是说,定义回调函数的时候不要使用结构体。
    //public delegate int ALARM_INFO(ALARMINFO AlarmInfo);    
    //定义委托的时候,使用指针。
        public delegate int ALARM_INFO(IntPtr Fi_AlarmInfo);  
    //回调函数处理        private int OnRecvAlarm(IntPtr Value)
            {
    //定义结构体大小的byte数组存放返回数据
                byte[] bdata = new byte[2616];
                Marshal.Copy(Value, bdata, 0, 2616);
    //这里定义你的结构,用来分析返回数据用。
                ALARMINFO AlarmInfo = new ALARMINFO();
    //注意C++的dll一般都是ascii编码的,C#是Unicode编码,有可能不能正常显示,要注意转换
                AlarmInfo.devip = Encoding.Default.GetString(bdata, 0, 20);
    //这是整数的转换
                AlarmInfo.channel = BitConverter.ToInt32(bdata, 20);
                AlarmInfo.ipnum = BitConverter.ToInt32(bdata, 24);
    //无数据类型的转换,一般是C++中word类型或long类型
                AlarmInfo.alarm_tm.wYear = BitConverter.ToUInt16(bdata, 2048);
    }
      
      

  5.   

    程序退出时因为C++组建的问题你需要让人调试DLL跟踪一下,一般回调在C#里是需要用委托来解决的。
    一般这种问题,可能是动态库出了问题,可能是你传入的参数啊什么的或者对象出了问题,都有可能,让DLL的制作者调试就完事了,你给他你的调用
      

  6.   

    希望还对其他用户有帮助,我的情况是程序调用回调函数一段时间后程序中止退出。后来看到帖子:
    http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/6bcf46db-2c2a-4201-9d90-5476be1c0a4f
    ,解决了我的问题。