2012-04-16 58 views
5

我有一个c#com类被umamaged代码使用。我可以调试它,但我不知道对象何时被释放。如果已经在C++中实现了,则会调用descructur,在C#中它将被释放给GC。有什么方法可以跟踪那个时刻吗? 在此先感谢。com对象c#的跟踪版本。

+0

您是否正在寻找终结器? – SLaks 2012-04-16 18:43:09

+0

只是好奇,你可以在这种情况下使用C#[析构函数](http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx)? – 2012-04-16 18:44:03

+0

这里没有快乐的答案。你的[ComVisible]类实例是一个普通的旧.NET对象。它通过CCW的参考文献保存下来。最后的Release()调用破坏了CCW,但是.NET对象没有任何反应。直到它像正常收集垃圾。您需要调试本机代码。无论如何,这个问题无疑是无疑的。 – 2012-04-16 19:58:24

回答

1

维护非托管资源的托管类型应实现IDisposable接口。这告诉消费者您的代码需要在对象的实例上调用Dispose()(即在可能的情况下将它们包装在using块中)。

IDisposable的正确实现将释放其终结器中的本地资源,但客户端可以比确定性释放非托管资源更早地调用Dispose()。无论哪种方式,您都可以避免泄漏,但最好尽快拨打Dispose()

Here is an SO question其中详述了该过程。

+0

问题是我无法控制非托管代码。 GC没有任何必要的清理工作。我只想知道我的对象的预期寿命是多少。 – user629926 2012-04-16 18:51:15

+0

如果你不能控制本地代码,那么我不明白这个问题。托管代码无法清除本地代码,除非本地代码定义了一个接口来执行此操作。 GC照顾你的托管包装是无关紧要的;它不只是神奇地清理本地的东西。你必须通过实现IDisposable并在本地资源上调用一些函数来释放它。 – 2012-04-16 18:59:58

+0

我没有任何本机资源进行清理,只是想知道什么时候管理整理器实现。 – user629926 2012-04-16 19:08:01