0

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

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

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

4

3 回答 3

2

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

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

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

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

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

于 2009-02-04T17:13:08.653 回答
1

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

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

请让我知道这对你有没有用 :)

于 2009-02-02T16:25:28.920 回答
0

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

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

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

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

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

于 2009-02-02T16:25:53.913 回答