Out of Process COM Server - 每个调用进程一个服务器进程?

Posted

技术标签:

【中文标题】Out of Process COM Server - 每个调用进程一个服务器进程?【英文标题】:Out of Process COM Server - One server process per calling process? 【发布时间】:2014-01-23 15:57:57 【问题描述】:

我有一个进程外的 com 服务器,将 CLSCTX_LOCAL_SERVER 指定为上下文,并将 REGCLS_MULTIPLEUSE 指定为连接类型。这会导致来自多个客户端的多次调用重用单个服务器进程。

我现在想对服务器进行一些更改,不幸的是,这不能与客户端之间共享的单个进程一起工作(这是有原因的,但他们很啰嗦)。我知道您可以将服务器设置为使用 REGCLS_SINGLEUSE 作为连接类型,这将为每次调用的 OOP 服务器创建一个新进程。这解决了我的问题,但在流程使用方面并非首发;短时间内多次调用会导致很多进程,并且这个特定的服务器可能会被频繁地击中。

有没有人碰巧知道混合这两种连接类型的机制?基本上我想要的是每个调用进程都有一个服务器进程。 (即,客户端 1 创建一个进程,该进程被该客户端的后续调用重用。客户端 2 尝试调用服务器,并创建一个新进程)。我怀疑我可以通过强制 REGCLS_SINGLEUSE 服务器在客户端中永久保持打开状态来实现它,但这既不优雅也不可能(因为我无法更改其中一个客户端)。

想法?

更新 正如预期的那样,似乎没有办法做到这一点。如果时间和资源允许,我很可能会将其转换为 In-Proc 解决方案。不过,就目前而言,我不得不采用用于任何呼叫客户端的新行为。幸运的是,这种变化的影响非常小,客户可以接受。稍后我会研究更剧烈和适当的更改。

注意 我已将 Hans 的回复标记为答案,因为它确实为维护 OOP 解决方案的问题提供了解决方案。我只是没有能力实现它。

卡尔

【问题讨论】:

因此,您想要一个进程内解决方案的所有好处,而不是进程内。这对吗?因为正如您所描述的那样,每个进程(该术语中的“proc”)正是这样做的,只有进程隔离是缺失的成分。 到目前为止(它是遗留代码)我没有发现任何迹象表明它确实需要退出进程,而且我个人会在进程中进行。不幸的是,这种更改的规模并不能证明更改此类内容时所需的测试是合理的。现在,我将新行为粘贴到 OOP 上,并接受它会稍微改变旧客户端行为。 @cal,最好的解决方案是Hans提到的Application coclass。 【参考方案1】:

COM 不支持这种激活方案。它应该由进程内服务器覆盖,请确保这不是您想要的方式,因为它具有相当大的优势。

使用 REGCLS_SINGLEUSE 是另一种选择,但这需要您扩展对象模型以避免现在创建的服务器实例风暴。 Application coclass 是样板方法。为它提供工厂方法,为您提供现有接口的实例。

我将提到一种截然不同的方法,当我也想解决相同的问题但需要进程外服务器以利用弥合位数差距时,我会使用这种方法。您不会被 COM 为您启动服务器进程所困,客户端也可以启动它。当然前提是它对服务器的安装位置有足够的了解。现在客户端当然可以完全控制服务器实例。服务器调用 CoRegisterClassObject() 并更改了 CLSID,我将部分 guid 与进程 ID 相异或。客户端也这样做,因此它始终与正确的服务器连接。客户端需要额外的代码来确保它等待足够长的时间让服务器有机会注册它的对象工厂。效果很好。

【讨论】:

REGCLS_SINGLEUSE 基本上是一个非入门者,代码本身可以很好地处理多个进程,但是客户端可能每秒多次点击该对象,从而创建一个不可接受的资源占用。更激进的方法会奏效,但我接触到的客户有点少,其中两个已经发布。这个对象的设计有很多问题,不幸的是,测试资源无法用于更剧烈的变化。 +1。先生,每个客户端的单个 coclass 服务器上的创造力非常简单。 “太棒了!”这几个字随之而来。当然不正常,但非常优雅。谢谢!

以上是关于Out of Process COM Server - 每个调用进程一个服务器进程?的主要内容,如果未能解决你的问题,请参考以下文章

找不到IIS Out-Of-Process Pooled

python out_of_process.py

ASP.NET Core 进程外(out-of-process)托管

Out of memory: Kill process 内存不足

Out of memory: Kill process 解决

out of memory kill process (java) score or a child