我有VS2010并在项目中添加了对COM库的引用,VS在项目中嵌入了一个主要的interop。
如果我从COM库中引用对象并且我想在不等GC的情况下快速处理它们,是否需要调用ReleaseComObject?
答案 0 :(得分:3)
Marshal.ReleaseComObject提供了一种方法,可以立即从托管代码中使用的所有位置删除对此COM对象的引用(因为它从持有它的RCW中释放底层IUnknown)。
正如Hans所说,通常正确的做法是简单地将对象置空,允许CLR和GC在适当的时候进行COM对象的破坏。
但是,在需要立即执行操作的情况下(COM对象包含昂贵/稀缺的资源,或者可能在排序期间排序非常复杂),调用ReleaseComObject可能是正确的做法。
马丁
答案 1 :(得分:0)
在清洁记忆方面有两种方法。
COM组件使用引用计数算法来回收内存。每当您不需要com组件的引用时,您可以调用它。但通常我的方法是创建一个虚拟堆栈并删除C#中下面的源代码等引用。只要RCW处于活动状态,COM就可以保证COM组件处于活动状态。当RCW被垃圾收集时,调用释放方法。没有必要在代码中调用release。但它不会影响gc循环。
void DoSth { { RunTimeCallableWrapper area for the code ReleaseComObject } }