如何强制进程外COM服务器的进程隔离?

如何强制进程外COM服务器的进程隔离?,com,interop,automation,legacy,Com,Interop,Automation,Legacy,我正在编写托管代码,该代码必须与进程外的供应商COM自动化服务器交互。我发现,如果有多个客户端连接到该服务器,则该服务器会变得不稳定。例如,如果进程A中的托管代码和进程B中的托管代码都连接到此COM服务器,则COM服务器将启动单个进程,并且其行为不太可靠我希望有一种方法可以强制每个客户机-服务器连接使用一个单独的进程。理想情况下,我希望以以下方式结束: 托管进程A与进程C1中的COM服务器对话 托管进程B在进程C2中与COM服务器通信 我想到的一个想法是,如果我使用不同的安全标识运行进程A和进程

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

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


我想到的一个想法是,如果我使用不同的安全标识运行进程A和进程B,这可能会导致COM基础设施创建单独的服务器进程。然而,我宁愿不走那条路。托管进程A和托管进程B实际上是Windows服务。我正在使用identity Local System运行它们(因为我需要它们能够与桌面交互,对于不作为本地系统运行的服务,您不能选中服务小程序上的“与桌面交互”框)。我需要与桌面交互的原因是,这个COM服务器偶尔会在屏幕上弹出一个对话框,如果服务本身无法与桌面交互,那么COM服务器将无法显示该对话框(我相信它显示在一个隐藏的WinStation上)。

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

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


让我知道它是否对你有用:)

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

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


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

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

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

我自己没有用进程外COM做过这件事,但有些事情你可以试试。最终,库只是一个坐在那里接收调用函数的消息的过程

您可以为每个客户端手动启动该进程的新副本,然后向其发送消息。你可能会因为这个而打嗝。例如,流程可能会检查它是否已经在运行,并拒绝启动或不满意


如果您对客户端的数量有一个已知上限,您可以考虑的另一种方法是多拷贝原始.exe文件,然后使用二进制修补(类似于微软研究中的DeReses库)来重写COM注册函数,并将每个副本登记为单独的COM对象。p> 最好的办法是让供应商修复组件。毕竟,如果它不能处理多个客户机,可能还有其他潜在的bug。如果你不能做到这一点,还有其他一些事情可以尝试

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

我自己没有用进程外COM做过这件事,但有些事情你可以试试。最终,库只是一个坐在那里接收调用函数的消息的过程

您可以为每个客户端手动启动该进程的新副本,然后向其发送消息。你可能会因为这个而打嗝。例如,流程可能会检查它是否已经在运行,并拒绝启动或不满意


如果您对客户端的数量有一个已知上限,您可以考虑的另一种方法是多拷贝原始.exe文件,然后使用二进制修补(类似于微软研究中的DeReses库)来重写COM注册函数,并将每个副本登记为单独的COM对象。p> 将组件注册到COM+,这将在您的位置放置一个隔离层。
使用:控制面板->管理工具
或cmd/executedcomcnfg

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

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

单击组件属性,选项卡标识,选择系统帐户


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

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

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

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

单击组件属性,选项卡标识,选择系统帐户

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

Heh,我想试试这个