如何利用带有自定义封送处理的 DCOM 垃圾收集器? (元帅)

How to leverage DCOM garbage collector with custom marshaling? (IMarshal)

我正在开发一个多租户 COM 服务器,它在层次结构中公开 类 不同的接口。一些 类 实施 IMarshal for more efficient custom marshaling using shared-memory for zero-copy exchange of immutable data buffers (based on "Inside COM+: Base Services" book). This works nicely but comes at the downside of losing automatic stub cleanup by the DCOM garbage collector if the client crashes or leaks handles. I've grown quite found of using COMGLB_FAST_RUNDOWN 以在客户端崩溃后快速清理存根,并且非常希望在可能的情况下也为 IMarshal 类 自动清理。

我已经尝试实施 IExternalConnection 来拦截来自客户端代理的引用释放事件。然而,这个接口 not 似乎是为 类 调用的,它也实现了 IMarshal。 IFastRundown 同样也不会为 类 实现 IMarshal 调用。

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

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

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

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

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

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

https://github.com/forderud/SharedMemMarshal 项目已更新为通过使用 CoMarshalInterface/CoUnmarshalInterface 从服务器到代理编组的小型 RefOwner class 来执行此操作。这都简化了 impl。以及加强它以更好地应对引用泄漏和客户端进程崩溃。