一个第三方COM组件,在C#项目中添加引用之后,如下面进行使用并释放,但发现该COM组件占用的内存并没有被释放:using ComClassWrapper;ComClass objComClass = new ComClass();
objComClass.Load("文件");
// To do something.
System.Runtime.InteropServices.Marshal.ReleaseComObject(objComClass);
怎样才能回收这类COM组件占用的内存?C# COM 组件 内存

解决方案 »

  1.   

    GC.Collection的有效范围是托管堆,这个COM组件分配的是非托管堆。
    有木有大神?
    DynamicMethod貌似也不行,无法通过GetMethod获取COM组件的MethodInfo
      

  2.   

    GC.Collection的有效范围是托管堆,这个COM组件分配的是非托管堆。
    有木有大神?
    DynamicMethod貌似也不行,无法通过GetMethod获取COM组件的MethodInfo
    你通过Visual Studio 把COM组件添加到工程中时,VS会自动把COM组件转换为一个互操作程序集,即带有interop的程序,然而你程序中实际用的就是这个互操作程序集,这个互操作程序是一个.NET 组件的,所以你用GC.Collection试试看,关于互操作更多内容可以参考这里:
    http://www.cnblogs.com/zhili/archive/2013/01/14/NetInterop.html
      

  3.   

    GC.Collection的有效范围是托管堆,这个COM组件分配的是非托管堆。
    有木有大神?
    DynamicMethod貌似也不行,无法通过GetMethod获取COM组件的MethodInfo
    你通过Visual Studio 把COM组件添加到工程中时,VS会自动把COM组件转换为一个互操作程序集,即带有interop的程序,然而你程序中实际用的就是这个互操作程序集,这个互操作程序是一个.NET 组件的,所以你用GC.Collection试试看,关于互操作更多内容可以参考这里:
    http://www.cnblogs.com/zhili/archive/2013/01/14/NetInterop.htmlGC.Collection已经试过无效。interop只是COM和.net之间的一个起到翻译作用的中间代理吧?
      

  4.   

    GC.Collection的有效范围是托管堆,这个COM组件分配的是非托管堆。
    有木有大神?
    DynamicMethod貌似也不行,无法通过GetMethod获取COM组件的MethodInfo
    你通过Visual Studio 把COM组件添加到工程中时,VS会自动把COM组件转换为一个互操作程序集,即带有interop的程序,然而你程序中实际用的就是这个互操作程序集,这个互操作程序是一个.NET 组件的,所以你用GC.Collection试试看,关于互操作更多内容可以参考这里:
    http://www.cnblogs.com/zhili/archive/2013/01/14/NetInterop.htmlGC.Collection已经试过无效。interop只是COM和.net之间的一个起到翻译作用的中间代理吧?
    对的,你的理解是对的。试试这个方法,更详细的内容参考下面的链接:
    http://support.microsoft.com/kb/317109
    和这个示例代码的实现:http://code.msdn.microsoft.com/CSAutomateWord-f422cae5#content你可以在线浏览源码的,上面提供了两种方式,你可以参考来解决你的问题,因为上面使用的是Word COM组件的。
      

  5.   

    回复5#:
    感谢你的回复,不过,你给的那两个链接使用的方法就是我提出问题时使用的方法。
    我使用的是一个第三方的COM组件,而且提问里的ComClass这个类没有实现IDisposable接口。
    我估计是这个COM组件本身的问题,现在能想到的就是动态进程或方法之类的可能才会有点戏
      

  6.   

    先是试过ApplicationDomain不行。
    最后用多进程+管道通讯总算搞定了,进程一退出,泄露的内存还能不回收?!