我正在编写托管代码,必须与供应商的COM自动化服务器进行交互。我发现如果多个客户端连接到它,该服务器就会变得不稳定。例如,如果我在进程A中的托管代码和进程B中的托管代码都连接到此COM服务器,则将为COM服务器启动单个进程,并且它的行为不太可靠。 我希望有一种方法可以为每个客户端强制执行单独的进程 - 服务器连接。理想情况下,我最终会:
托管流程在流程 C1 中与COM服务器通信 托管进程B在进程中与COM服务器通信 C2
我想到的一个想法是,如果我使用不同的安全标识运行进程A和进程B,那可能会导致COM基础结构创建单独的服务器进程。但是,我宁愿不去那条路。托管进程A和托管进程B实际上是Windows服务。我正在使用身份本地系统运行它们(因为我需要它们能够与桌面交互,并且您无法检查服务小程序上的“与桌面交互”框,以获取不作为本地运行的服务系统)。我需要与桌面交互的原因是这个COM服务器偶尔会在屏幕上抛出一个对话框,如果服务本身无法与桌面交互,那么COM服务器就会产生无法显示对话框(我相信它是显示在隐藏的WinStation上。
答案 0 :(得分:2)
将组件注册到COM +,这会在您的。上放置一个隔离层
使用:控制面板 - >管理工具
或cmd /执行DCOMCNFG
组件服务 - >计算机 - >我的电脑 - > COM +应用程序,右键单击,新建应用程序,接下来,创建一个空应用程序,输入应用程序名称“COM + your.dll”,然后选择本地服务,下一步,接下来,完成。
在新项目中,展开,在“组件”中,右键单击,新组件,然后选择“安装新组件”,选择您的组件。
单击“组件属性”,“标签”选项卡,选择“系统帐户”。
对于通话中的错误,请参阅事后。
答案 1 :(得分:1)
我做完这个已经有一段时间了,所以我的记忆很模糊。
如果使用DCOM配置工具将OOP COM服务器配置为DCOM服务器,我相信您可以指定隔离级别。我在几年前做了一个非线程安全的进程内DLL,需要以线程安全的方式从IIS访问它并且它很有魅力。
让我知道它是否适合你:)
答案 2 :(得分:0)
您最好的选择是让供应商修复该组件。毕竟,如果它不能处理多个客户端,可能会有其他错误潜伏。如果你不能这样做,还有其他一些事情要尝试。
使用进程内COM对象我已经有了手动加载dll并直接访问接口而无需通过COM。
我自己没有使用进程外COM,但有些事情你可以尝试。最终,图书馆只是一个接收调用函数的消息的过程。
您可以为每个客户端手动启动进程的新副本,然后向其发送消息。你可能会遇到一些打嗝。例如,该过程可能会检查它是否已经运行并且拒绝启动或者不满意。
如果您有一个已知的客户端数量上限,您可以考虑的另一种方法是制作原始.exe文件的多个副本,然后使用二进制修补(类似于Microsoft Research的detours库)到覆盖COM注册函数并将每个副本注册为单独的COM对象。