C#调用C++写的dll,dll中处理一个循环(是一个读取视频的,每次循环读取一帧,调用了opencv库),循环内有个回调函数,传出数据供C#的函数使用。C#中另开了一个线程处理对dll的调用。运行时一切正常,可每次关闭Form时,提示 **.vshost.exe应用程序错误,提示访问了不能为“read”的内存,请问是什么错误造成的啊?dll中的函数在控制台下执行时正确无误。 

解决方案 »

  1.   

    貌似有很多指针,c#调用C++的dll切忌不能在c#中分配内存!也就是说你的所有new的东西全部都要放置到dll中的。这种东西调试也很不容易。祝你好运!
      

  2.   

    C#就弄了个界面,中间确实有一句分配内存的,是把dll传过来的回调函数的一个char指针的数据放到一个Bitmap里面,然后在pictureBox中显示,运行时显示正常,关闭程序时出问题,调试也没有办法定位到那个错误的地方啊,郁闷了
      

  3.   

    如果要在把new操作全部放到dll里,那就得传出来一个Bitmap或者pictureBox支持的流? 是using MFC Shared dll,格式难转换啊
      

  4.   

        我想可能是因为你关闭窗口时这个dll还在运行,而你另开的线程又是一个后台线程,所以会出错。
    请问你另开的线程是new出来的还是从线程池获得的,如果是从线程池获得的,就一定是后台线程,改成new一个试试。
      

  5.   

    new 出来,可能不是这个问题,我把dll中的循环改成一个普通的死循环(没有调用opencv读取视频流), 程序关闭时就正常了,不会弹出那个错误提示。
      

  6.   

    我在dll循环中有加了个判断强制释放资源的回调函数,程序关闭时调用该函数,并且主线程阻塞100ms,暂时解决了这个问题