一个vc的dll,在c#中返回一个字符串:    [DllImport("a.dll", EntryPoint = "A_Receive")]
    public static extern uint A_Receive(string A_Type, out string A_Text);在C#中,随着不断的调用,系统内存会被耗尽。对于这种在dll里面分配的内存,在C#中需要特殊处理进行释放么?或者定期执行GC.Collect();就可以了?

解决方案 »

  1.   

    谁申请,谁释放。
    你用dll来申请的内存,应该由dll来释放,自己再开个释放函数吧
      

  2.   

    这不应属于托管资源,需要Dll自己提供释放接口吧
      

  3.   


    问题就在于这个dll不是自己写的,没有办法修改了。
      

  4.   


    dll本身是不提供释放接口,也没法修改。那在非托管模式下能释放么?
      

  5.   

    非托管模式?那你C#还能用吗?
    如果dll别人提供的,只能说这个dll很垃圾
      

  6.   


    不可否认,这个dll很垃圾,但现在没有办法,呵呵。
      

  7.   

    既然很垃圾,那就反编译这个dll,你自己重新写个就是的
      

  8.   


    非常赞同。但最后说开个函数释放,有点误导。
    没什么补充的,谁申请,谁释放。说的很准确了。不是你申请的内存,就不要释放,托管内存就让gc自己处理好了。关闭窗体时候,你可以尝试手工调用gc.collect,因为关闭毕竟是很少做的操作。不要大量的调用gc.collect就好了。
      

  9.   


    首先,在clr里面不释放的结果就是内存泄漏,也就是本问题希望解决的。其实也不是绝对谁申请,谁释放,像下面文章说的那样,也可以dll里面申请,clr里面会自动释放,但要求dll里面是通过CoTaskMemAlloc 申请的内存:
    http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx由于这个原始的dll也不知道什么方式申请的,但从clr没有自动释放内存来看,应该不是通过CoTaskMemAlloc。就是不知道是否能用非托管方式,像调用c++里面的delete一样来释放内存。
      

  10.   


    反编译一个c++的dll,重写就太费劲了。呵呵。
      

  11.   

    是存在msdn上介绍的可能,但是如果没有详细说明,一般设计的时候。尽量不要这样设计,谁申请谁释放,这毕竟是c/c++沿用至今的方法。vc.net具有操作托管代码的能力,但这绝对不是值得推荐的。