如何在COM对象中实现Dispose

时间:2009-05-14 23:51:37

标签: .net com interop

我在非托管C ++中编写了一个COM组件,以便客户访问我们的数据库。从非托管语言使用它时,数据库连接会在对象超出范围时正确清理。我最近尝试从VB.NET中使用它,发现COM对象没有被破坏。散布对 System.Runtime.InteropServices.Marshal.ReleaseComObject 的调用解决了这个问题,但我想找到一个更简单且异常安全的解决方案,因为这个COM对象是为客户使用而设计的。

似乎正确的解决方案是让托管对象实施 IDisposeable ,以便可以使用使用语句,自动调用 Dispose 不再需要该对象。

如何为我的对象子集实现IDisposeable?需要处理的几个对象不是可共同创建的,而是由其他函数返回。

2 个答案:

答案 0 :(得分:2)

疯狂就是这样。你最好将COM对象包装在实现IDisposable的类型安全的.Net包装器中(如果你愿意),或者使用.Net垃圾收集的常规方法来清理它们。

答案 1 :(得分:2)

您可以使用.NET封装器,如1800信息所示,然后记得始终将它们与using语句一起使用,如您所说:

using( var connection = GetDisposableConnection() )
{
    //do stuff
}

如果由于某些内容未正确发布而无效,您可以在关闭时插入这些行:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();