问题描述:
我做的项目程序中有个读写手机卡通讯录的功能窗体a。用了a读写手机卡后,关闭a没关闭程序:这样不能安全删除USB上的u盘。想安全删除U盘必须关闭整个程序,这个情况让我们的客户非常不满,说用你们的某某功能竟然连U盘都不能安全拔出了,不行了。问题就出来了,如何解除程序与USB关联性,注意是要在不关闭主程序的前提下。
知道肯定可以实现的,有个unlocker(牛逼程序呀:就可以实现,能够找出U盘正被那些程序锁定并解锁),我水平太菜,看了他介绍的原理分析,晕呼呼的,不懂哎。请各位大侠帮忙,请能搞定,感谢至极,并且送1000分!!!

解决方案 »

  1.   

    都关了。而且.net会自动回收资源的吧
      

  2.   

    检查是否有句柄泄漏?在使用USB的时候是否将其关联的句柄都关闭?你是怎么使用USB的,第三方组件?unlocker会检查和目标相关联的内核资源是否都被释放,比如关联的文件句柄是否关闭?托管代码在访问这些非托管代码的时候需要使用IDispose接口来释放非托管资源。
      

  3.   


    第三方组件?  是的,USB设备商提供的dll引用来读写操作usb盘的。
    问题就是如何将其关联的句柄都关闭?详细点。我这里需要的就是与本程序关联的移动盘句柄都关闭
      

  4.   

    在使用USB的时候是否将其关联的句柄都关闭?或者说我在使用USB的时候 能够将其句柄取到不??如果能的话,我在关闭的时候判断如果句柄不为空的话就关闭句柄这样可以不?请高手看看。能给出解答的,请详细点,谢谢
      

  5.   

    第三方组件?  是的,USB设备商提供的dll引用来读写操作usb盘的。
    既然有操作读写的 那么就应该有关闭的吧
      

  6.   

    目前情况是有关闭的函数,已经用过了,对这个没用。
    还有,按道理,我是这个主程序中的一个窗体去读写的,应该是这个窗体和USB关联,关闭整个窗体就自动把这些资源自动清理了,但实际没有,是这整个程序和USB关联,要让USB安全拔出,必须关闭整个程序
      

  7.   

    可以从这几个方向考虑
    1,在封装USB访问的类实现IDispose接口,释放非托管资源。
    2,调用GC函数,强制垃圾回收一下。
    3,把USB访问类做到外部EXE,通过Process来执行,通过临时文件传递通信录数据。
      

  8.   

       [System.Runtime.InteropServices.DllImport("Kernel32")]
            private extern static Boolean CloseHandle(IntPtr handle);        // Use C# destructor syntax for finalization code.
            // This destructor will run only if the Dispose method
            // does not get called.
            // It gives your base class the opportunity to finalize.
            // Do not provide destructors in types derived from this class.
            ~Record()
            {
                // Do not re-create Dispose clean-up code here.
                // Calling Dispose(false) is optimal in terms of
                // readability and maintainability.
                Dispose(false);
            }
     对于非托管资源。最好用其自身的析构并且 GC.SuppressFinalize(this)
      

  9.   

    如何得到我正在插入这个U盘的句柄?
    如何得到我正在插入这个U盘的句柄?
    我在关闭窗体前 先关闭U盘的句柄,这样怎么样呢??
      

  10.   


    可能是因为DLL被程序加载了,而Dll关联了USB,导致USB无法安全拨出。释放Dll?
      

  11.   

    你这种情况肯定不能靠.net自动回收资源的,它现在虽说是自动托管回收资源,但是不是实时的,说不定要到什么时候才执行呢...就跟连接数据库一样,及时断开得自己写代码