首页 > 解决方案 > 如何通过自定义封送处理利用 DCOM 垃圾收集器?(元帅)

问题描述

我正在开发一个多租户 COM 服务器,该服务器在层次结构中公开具有不同接口的类。一些类实现IMarshal以使用共享内存进行更有效的自定义封送处理,以实现不可变数据缓冲区的零拷贝交换(基于“Inside COM+: Base Services”一书)。这很好用,但如果客户端崩溃或泄漏句柄,DCOM 垃圾收集器会丢失自动存根清理的缺点。我已经发现在客户端崩溃后使用COMGLB_FAST_RUNDOWN进行快速存根清理,并且如果可能的话,我也非常希望对IMarshal类进行自动清理。

我已经尝试实现IExternalConnection从客户端代理拦截参考发布事件。但是,对于同样实现 IMarshal 的类,似乎没有调用此接口。IFastRundown同样也不需要实现 IMarshal 的类。

我不愿意实现自己的看门狗来检测和处理客户端进程崩溃,因为这需要手动记录每个客户端为实现 IMarshal 的每个对象实例持有的引用。这对我来说听起来像是很多簿记。此外,检测客户端进程 PID 也不方便,特别是如果由于多租户架构需要为每个对象引用单独完成时。利用 DCOM 垃圾收集器将使一切变得更加容易。

关于如何为实现 IMarshal 的类启用 DCOM 垃圾收集器的任何建议?

我想我希望的是某种形式的每对象事件机制,用于在客户端引用被释放时收到通知,如果客户端崩溃也会发送一个事件。

小型复制器项目:https ://github.com/forderud/SharedMemMarshal

标签: comdcom

解决方案


回答自己,因为我刚刚找到了解决这个问题的方法。

可以引入一个额外的 COM 对象来维护从客户端代理返回到服务器的引用

https://github.com/forderud/SharedMemMarshal项目已更新为通过一个小型 RefOwner 类执行此操作,该类使用/CoMarshalInterfaceCoUnmarshalInterface服务器到代理进行编组。这都简化了 impl。以及强化它以更好地应对参考泄漏和客户端进程崩溃。


推荐阅读