应该是delPtr 被垃圾收集了吧。GCHandle gch = GCHandle.Alloc(delPtr);
GC.Collect();
bool tcb = EnableCallback(delPtr);
gch.Free(); //这句必须在确定C/C++不再调用delPtr后才能调用。建议将delPtr变成static的。这样最简单了。

解决方案 »

  1.   

    加一句就应该能解决问题GC.KeepAlive(delPtr);
      

  2.   

    我想一楼二楼都说得对,做了相应的改进后到现在为止我的程序工作正常。多谢!
    只是有一点,不知道怎样将delPtr变成static, 如果用static PtrNotify delPtr通不过编译。不过,delPtr是否static似无关紧要,不是大问题。
      

  3.   

    很简单改动一下。
    PtrNotify delPtr = new PtrNotify(NotifyProcedure);
    这句挪到函数外面,成为成员变量即可。
    当然了。你定义写函数外,使用时检查一下。
    PtrNotify delPtr = null;
    public void someFunc()  
    {
      if(delPtr==null)delPtr = new PtrNotify(NotifyProcedure);
      bool tcb = EnableCallback(delPtr);
    }
      

  4.   

    C#的类方法应该是8字节吧,DELPHI的类方法是8字节。。你的DLL里面的全局函数回调类型的指针应该是4字节吧。。你赋值给它会出问题吧。