【问题标题】:How to force process isolation for an out of process COM server?如何强制进程外 COM 服务器的进程隔离?
【发布时间】:2010-10-04 23:04:42
【问题描述】:

我正在编写托管代码,该代码必须与供应商的 COM 自动化服务器进行交互,但该服务器已用完进程。我发现如果有多个客户端连接到该服务器,它就会变得不稳定。例如,如果我在进程 A 中的托管代码和进程 B 中的托管代码都连接到此 COM 服务器,则将为 COM 服务器启动一个进程,并且它的行为不太可靠。 我希望有一种方法可以为每个客户端 - 服务器连接强制执行单独的进程。理想情况下,我希望最终得到:

托管进程 A 与进程 C1 中的 COM 服务器通信
托管进程 B 在进程 C2

中与 COM 服务器通信

我想到的一个想法是,如果我以不同的安全身份运行进程 A 和进程 B,这可能会导致 COM 基础架构创建单独的服务器进程。然而,我宁愿不走那条路。托管进程 A 和托管进程 B 实际上是 Windows 服务。而且我正在使用身份本地系统运行它们(因为我需要它们能够与桌面交互,并且您无法检查服务小程序上的“与桌面交互”框以获取不作为本地运行的服务系统)。而我需要与桌面交互的原因是这个COM服务器偶尔会在屏幕上抛出一个对话框,如果服务本身不能与桌面交互,那么COM服务器生成的不能显示对话框(我相信它是显示在隐藏的 WinStation 上)。

【问题讨论】:

    标签: com interop automation legacy


    【解决方案1】:

    放置在 COM+ 注册的组件,这会在你的位置放置一个隔离层。
    使用:控制面板->管理工具
    或 cmd/执行 DCOMCNFG

    组件服务->计算机->我的电脑->COM+应用程序,右键,新建应用程序,下一步,创建一个空应用程序,输入应用名称“COM+ your.dll”,下一步,选择本地服务,下一步,下一步,接下来,完成。

    在新建项目中,展开,在组件处,右键单击,新建组件,下一步,选择安装新组件,选择您的组件。

    单击组件属性,选项卡身份,选择系统帐户。

    有关调用中的错误,请参阅事件之后。

    【讨论】:

    • 供应商的 COM 服务器处于进程外(即 .EXE)。你的建议还有效吗?谢谢!
    【解决方案2】:

    我已经有一段时间没有这样做了,所以我的记忆很模糊。

    如果使用DCOM config工具将OOP COM服务器配置为DCOM服务器,相信可以指定隔离级别。几年前,我使用了一个非线程安全的进程内 DLL,需要从 IIS 以线程安全的方式访问它,它很有魅力。

    让我知道它是否适合你:)

    【讨论】:

    • 呵呵,我先试试这个。比尔
    【解决方案3】:

    最好的办法是让供应商修复组件。毕竟,如果它不能处理多个客户端,可能还有其他错误潜伏着。如果你不能做到这一点,还有其他一些事情可以尝试。

    对于进程内 COM 对象,我有时需要手动加载 dll 并直接访问接口,而无需通过 COM。

    我自己没有使用进程外 COM 完成此操作,但您可以尝试一些方法。最终,库只是一个坐在那里接收调用函数的消息的进程。

    您也许可以为每个客户端手动启动流程的新副本,然后向其发送消息。你可能会遇到一些麻烦。例如,进程可能会检查它是否已经在运行并拒绝启动或不满意。

    如果您知道客户端数量的上限,您可以考虑的另一种方法是制作原始 .exe 文件的多个副本,然后使用二进制补丁(类似于 Microsoft Research 的 detours 库)来覆盖 COM 注册函数并将每个副本注册为单独的 COM 对象。

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 2011-01-20
      • 2013-01-20
      • 2012-09-06
      • 2011-05-17
      • 2015-05-23
      • 2012-10-10
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多