在做COM时,是否有必要在C#4中调用Marshal.ReleaseComObject?

时间:2011-07-06 21:07:37

标签: com c#-4.0

我有VS2010并在项目中添加了对COM库的引用,VS在项目中嵌入了一个主要的interop。

如果我从COM库中引用对象并且我想在不等GC的情况下快速处理它们,是否需要调用ReleaseComObject?

2 个答案:

答案 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
       }  
 }