我有一个c#com类被umamaged代码使用。我可以调试它,但我不知道对象何时被释放。如果已经在C++中实现了,则会调用descructur,在C#中它将被释放给GC。有什么方法可以跟踪那个时刻吗? 在此先感谢。com对象c#的跟踪版本。
回答
维护非托管资源的托管类型应实现IDisposable接口。这告诉消费者您的代码需要在对象的实例上调用Dispose()
(即在可能的情况下将它们包装在using
块中)。
IDisposable
的正确实现将释放其终结器中的本地资源,但客户端可以比确定性释放非托管资源更早地调用Dispose()
。无论哪种方式,您都可以避免泄漏,但最好尽快拨打Dispose()
。
Here is an SO question其中详述了该过程。
问题是我无法控制非托管代码。 GC没有任何必要的清理工作。我只想知道我的对象的预期寿命是多少。 – user629926 2012-04-16 18:51:15
如果你不能控制本地代码,那么我不明白这个问题。托管代码无法清除本地代码,除非本地代码定义了一个接口来执行此操作。 GC照顾你的托管包装是无关紧要的;它不只是神奇地清理本地的东西。你必须通过实现IDisposable并在本地资源上调用一些函数来释放它。 – 2012-04-16 18:59:58
我没有任何本机资源进行清理,只是想知道什么时候管理整理器实现。 – user629926 2012-04-16 19:08:01
- 1. 如何跟踪COM对象异常?
- 2. “跟踪”版本的readlink(1)
- 3. 有没有对象更改跟踪/版本控制的Java API?
- 4. C++:跟踪所有现有的对象
- 5. 跟踪firstResponder对象
- 6. COM对象和不同版本的DLL
- 7. 获取COM对象的版本
- 8. COM C#内存泄漏跟踪
- 9. _CrtSetBreakAlloc跟踪COM对象中的内存泄漏
- 10. Git会跟踪版本吗?
- 11. 跟踪页面版本
- 12. 版本跟踪与mysql
- 13. 版本/跟踪实体
- 14. 跟踪对象在C中访问
- 15. C#摄像头对象跟踪
- 16. OpenCV C++简单对象跟踪
- 17. 跟踪深度的对象
- 18. OpenCV中的对象跟踪
- 19. 版本控制Windows COM对象
- 20. 在应用程序中跟踪COM对象错误
- 21. 通过OpenCV跟踪对象
- 22. 保持跟踪MKAnnotationView对象
- 23. 跟踪对象和引用
- 24. Hibernate会话跟踪对象
- 25. THREE.js跟踪模型(对象)
- 26. 数据库对象跟踪
- 27. 使用javaCV跟踪对象
- 28. 跟踪视频对象
- 29. 跟踪assinged对象分配
- 30. 对象检测/跟踪
您是否正在寻找终结器? – SLaks 2012-04-16 18:43:09
只是好奇,你可以在这种情况下使用C#[析构函数](http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx)? – 2012-04-16 18:44:03
这里没有快乐的答案。你的[ComVisible]类实例是一个普通的旧.NET对象。它通过CCW的参考文献保存下来。最后的Release()调用破坏了CCW,但是.NET对象没有任何反应。直到它像正常收集垃圾。您需要调试本机代码。无论如何,这个问题无疑是无疑的。 – 2012-04-16 19:58:24