我有 Out-of-Proc,实际上是 DllSurrogate COM-Server,用 C++、ATL 编写,在我之前的 SO问题中提到过。我正在使用来自许多客户端和 C# 应用程序的 COM-Server 创建和/或连接单例CoCreateInstance
。在完成使用 COM 对象后,它们都调用了各自的释放。在 Delphi 中,当接口超出范围时,它基于接口 Release Reference Count,在 C# 中,它被调用Marshal.ReleaseComObject
,直到似乎一切正常。
问题是客户端应用程序意外关闭时,例如从进程中终止或崩溃。在这种情况下,COM 对象保留在内存中,加载在 DLLHOST.exe 中。
是否有一些标准方法可以避免此类泄漏?或者可能问题在于 COM-Server 本身是如何编写的(我有来源,他们不属于我的责任,我不知道 ATL)
已编辑:我发现 COM 有它自己的垃圾收集机制,该机制在 6-8 分钟后清除仍然存在的孤立 COM 对象(@Simon Mourier 的坦克)。现在是应用程序逻辑来处理仍然存在的孤立 COM 对象,例如重新初始化它或其他东西。