我在非托管C ++中编写了一个COM组件,以便客户访问我们的数据库。从非托管语言使用它时,数据库连接会在对象超出范围时正确清理。我最近尝试从VB.NET中使用它,发现COM对象没有被破坏。散布对 System.Runtime.InteropServices.Marshal.ReleaseComObject 的调用解决了这个问题,但我想找到一个更简单且异常安全的解决方案,因为这个COM对象是为客户使用而设计的。
似乎正确的解决方案是让托管对象实施 IDisposeable ,以便可以使用使用语句,自动调用 Dispose 不再需要该对象。
如何为我的对象子集实现IDisposeable?需要处理的几个对象不是可共同创建的,而是由其他函数返回。
答案 0 :(得分:2)
答案 1 :(得分:2)
您可以使用.NET封装器,如1800信息所示,然后记得始终将它们与using语句一起使用,如您所说:
using( var connection = GetDisposableConnection() )
{
//do stuff
}
如果由于某些内容未正确发布而无效,您可以在关闭时插入这些行:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();