我有一个VB6应用程序,它引用了一个通过COM引用C#.Net库的VB6 ActiveX.exe应用程序。那个C#库有一个可注册的回调方法,我冒泡到原来的应用程序。 C#库有两种方法。一个人只是调用回调。另一个信号表示触发简单线程调用回调的事件。如果在我的原始应用程序中,我只使用direct方法,当我设置activeX = Nothing时,activeX应用程序将从任务管理器窗口中消失。如果我只调用一次线程方法,则在终止时,activeX应用程序不会从任务管理器中消失长达五分钟。它最终会消失。有没有人曾经处理过这种行为,如果有的话,我如何让activeX终止?
答案 0 :(得分:4)
最有可能的是,您的C#对象没有实现IDisposable,并且您没有明确地处理它们。在这种情况下,如果将VB6 activex exe中的回调对象传递给C#lib,即使在释放了对象之后它也会在其对象中保存该引用,因为C#它是垃圾收集的。最后,当收集器清理时,它释放那些C#对象,然后释放对VB6回调对象的引用,一切都清除。
答案 1 :(得分:1)
可能正如其他答案所述,它是垃圾收集器。既然你知道你的VB6应用程序何时终止,那么尝试不传递给.NET回调,看看是否会提前释放。
确保在终止任何基于VB6的组件时进行明确清理。
答案 2 :(得分:0)
有人在其他地方发布了一本名为.NET Gotchas的书,可能与您的问题有关。我已经订购了这本书,但还没到。基本上,垃圾收集器还没有完成吸烟中断并收集未使用的物体。