调试时正常运行
   运行时却报错。

解决方案 »

  1.   

    报什么错误?是Winform?Web?还是Windows Service?环境有什么不一样?
      

  2.   

    [DllImport("playm4.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public unsafe static extern bool PlayM4_ConvertToBmpFile(IntPtr pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName);        public delegate void CallBack(int nPort, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved);        [DllImport("playm4.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public unsafe static extern bool PlayM4_SetDisplayCallBack(int nPort,CallBack cb);
             private  void  DisplayCBFun(int nPort,IntPtr pBuf,int nSize,int nWidth,int nHeight,int nStamp,int nType,int nReceaved)
     {
      //  GC.Collect();
       if(!g_bCapPic)
    return;
    //转换函数,比较耗时,如果不想保存图片,请不要调用;
    string csDir;
    string csFile;
    DateTime time=System.DateTime .Now;    csFile ="C:\\Picture\\"+time.ToString("yyyy-MM-dd-HH-mm-ss") + ".bmp";
       
    if(!PlayM4_ConvertToBmpFile(pBuf,nSize,nWidth,nHeight,nType,csFile))
    {
            MessageBox.Show("不成功!");
    }
       // this.CapPicName = csFile;
        
    g_bCapPic=false;
       
       }
    调用的地方
      CallBack cb = new CallBack(this.DisplayCBFun);
                   PlayM4_SetDisplayCallBack(USED_PORT, cb);
                    if ((PlayM4_Play(99, this.panel1.Handle)) == false)
                    {
                        PlayM4_CloseFile(USED_PORT);
                        return;
                    }//出错的地方就是这个回调的过程。去掉回调就没问题了。。
      

  3.   

    private  void  DisplayCBFun(int nPort,IntPtr pBuf,int nSize,int nWidth,int nHeight,int nStamp,int nType,int nReceaved)
     {
     GC.Collect();
    在调试时是不去掉的。
    负责调试时就报错
      

  4.   

    boytomato(深爱一人叫颖的女孩!) ( ) 信誉:100    Blog   加为好友  2007-06-07 11:34:43  得分: 0  
     
     
       private  void  DisplayCBFun(int nPort,IntPtr pBuf,int nSize,int nWidth,int nHeight,int nStamp,int nType,int nReceaved)
     {
     GC.Collect();
    在调试时是不去掉的。
    负责调试时就报错------------------------------------------------------------
    那为什么在运行时又要去掉呢?
      

  5.   

    这个很正常!可能是传的参数有问题,或者有bug
      

  6.   

    去掉  
    GC.Collect();
    会出现
    对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
      

  7.   

    GC.Collect(); 可能收集了还在使用的对象
      

  8.   

    去掉  
    GC.Collect();
    会出现
    对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
    ---------------------------------------------------------------------------
    这个说明了委托线程被释放首先确定你的调用线程 和你的委托线程具有更长的生命期
    GC.Collect(); 可能收集了还在使用的对象
      

  9.   

    if ((PlayM4_Play(99, this.panel1.Handle)) == false)
                    {
                        PlayM4_CloseFile(USED_PORT);
                        return;
                    }
    ------------------------------------------------------------------------
    确定一下 PlayM4_Play 函数是不是在本线程执行 还是另起新线程 
    如果是另起的话 毛病是在这了
      

  10.   

    调用的地方
    CallBack cb = new CallBack(this.DisplayCBFun); //
    PlayM4_SetDisplayCallBack(USED_PORT, cb);  //去掉这两行程序就好了还是回掉出错。
    if ((PlayM4_Play(99, this.panel1.Handle)) == false)
    {
    PlayM4_CloseFile(USED_PORT);
    return;
    }
      

  11.   

    这行是写在什么地方的,
      CallBack cb = new CallBack(this.DisplayCBFun);
    如果是写在方法中的,那么改到类中,作为类的私有成员试一下
      

  12.   

    boytomato(深爱一人叫颖的女孩!) ( ) 信誉:100    Blog   加为好友  2007-6-7 17:22:28  得分: 0  
     
     
       
    确保委托实例的生存期覆盖非托管代码的期;
    否则,委托在经过垃圾回收后将不再可用我这出错也就是上边。
    可是如何确保呢???--------------------------------------------------
    不要让垃圾回收器回收这个回调函数和它使用的资源试试!
      

  13.   

    to  bestshl(快乐的Coder) 把委托定义为类的成员变量,不要让它被回收。我把委托定义成静态函数也一样是这个问题
      

  14.   

    对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。时不时会提示这样的错误。
      

  15.   

    boytomato(深爱一人叫颖的女孩!) ( ) 信誉:100    Blog   加为好友  2007-06-08 09:17:28  得分: 0  
     
     
       对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。时不时会提示这样的错误。------------------------------------------------------------------
    用GCHandle.Alloc()方法将CallBack锁住,这样GC就不会回收这个CallBack了!