com - 如何通过自定义封送处理利用 DCOM 垃圾收集器?(元帅)
问题描述
我正在开发一个多租户 COM 服务器,该服务器在层次结构中公开具有不同接口的类。一些类实现IMarshal以使用共享内存进行更有效的自定义封送处理,以实现不可变数据缓冲区的零拷贝交换(基于“Inside COM+: Base Services”一书)。这很好用,但如果客户端崩溃或泄漏句柄,DCOM 垃圾收集器会丢失自动存根清理的缺点。我已经发现在客户端崩溃后使用COMGLB_FAST_RUNDOWN进行快速存根清理,并且如果可能的话,我也非常希望对IMarshal
类进行自动清理。
我已经尝试实现IExternalConnection
从客户端代理拦截参考发布事件。但是,对于同样实现 IMarshal 的类,似乎没有调用此接口。IFastRundown
同样也不需要实现 IMarshal 的类。
我不愿意实现自己的看门狗来检测和处理客户端进程崩溃,因为这需要手动记录每个客户端为实现 IMarshal 的每个对象实例持有的引用。这对我来说听起来像是很多簿记。此外,检测客户端进程 PID 也不方便,特别是如果由于多租户架构需要为每个对象引用单独完成时。利用 DCOM 垃圾收集器将使一切变得更加容易。
关于如何为实现 IMarshal 的类启用 DCOM 垃圾收集器的任何建议?
我想我希望的是某种形式的每对象事件机制,用于在客户端引用被释放时收到通知,如果客户端崩溃也会发送一个事件。
解决方案
回答自己,因为我刚刚找到了解决这个问题的方法。
可以引入一个额外的 COM 对象来维护从客户端代理返回到服务器的引用。
https://github.com/forderud/SharedMemMarshal项目已更新为通过一个小型 RefOwner 类执行此操作,该类使用/CoMarshalInterface
从CoUnmarshalInterface
服务器到代理进行编组。这都简化了 impl。以及强化它以更好地应对参考泄漏和客户端进程崩溃。
推荐阅读
- angular - 无论我做什么,变量都是未定义的
- node.js - 从目录加载模块与预期不同
- python - 将自定义迁移限制为一个模型
- c++ - 如何检查字符串是否包含所有这些:数字、字母和特殊字符?
- linux - 如何为 GIT 存储库中的文件创建符号链接
- autohotkey - 如何在 OneNote(UWP) 中制作 AutoHotkey 选笔脚本?
- ios - 如何修复颤振中的“终止原因:命名空间代码设计,代码 0x2”错误?
- ruby-on-rails - Rails - 多态关联 - 处理可选关联的最佳实践
- jquery-ui - JQueryUI 中未显示辅助按钮图标
- javascript - 无法识别pdf文件multer node js