.NET进程外COM对象在API调用中共享静态实例

|| 很难解释我们的立场。 我们有一个三层应用程序。引擎是用C ++编码的DLL,然后我们有一个VB6 ActiveX EXE,可以通过API调用来访问引擎,并且在顶层,我们有一个Excel插件(在C#中使用VSTO框架)使用互操作DLL调用中间层。此时,从外接程序到引擎的每个“连接”都会创建一个新的EXE(VB6使用API​​调用来访问引擎),并且一切正常。 现在我们将中间层移到.NET,它可以正常运行(通过所有单元测试),但是,当我们同时打开2个“连接”时,发现一个错误(ups,没有单元)测试一下这种情况,因为它是一种新行为)。 DLL具有静态对象,该对象在同一进程中的所有实例之间共享,并且我们在“连接”之间具有交互作用。在我们的旧版本中,每个“连接”都会创建一个新的EXE,并且进程之间没有内存共享,现在它是同一进程,并且它们共享内存和静态对象。 遵循此问题的提示。我们试图在C#中构建一个COM EXE,以在中间层执行进程外对象,但结果相同。它们共享静态对象,最后,每个连接都不创建独立的进程。 很明显,但此时负担不起,可以将API调用移至ATL或将静态对象更改为带有句柄的可实例化引用,并更改所有API调用以获取/设置此处理程序。我查看了MS All-in-one中的所有示例,但没有找到任何解决方案。不可能一次仅保持一个连接,每个工作簿都可以具有一个连接,并且将来我们希望探索同时具有多个连接的Web应用程序。 有什么建议吗? 提前致谢,     
已邀请:
COM是为每个COM对象启动新的EXE,还是使用单个EXE实例化所有对象,这由传递给CoRegisterClassObject的标志参数控制。看到 http://msdn.microsoft.com/zh-CN/library/ms693407(v=vs.85).aspx,以及 http://msdn.microsoft.com/zh-CN/library/ms679697(v=vs.85).aspx 您需要传递REGCLS_SINGLEUSE或REGCLS_MULTI_SEPARATE标志。 现在,诀窍是传递此标志,因为您可能不会直接调用此方法-详细信息取决于您实现COM EXE的方式。     
这个问题尚不清楚,但这听起来像您已经将其作为VB6 EXE构建的“中间层”,而您正试图将其替换为.net DLL。如果真是这样,您肯定会得到您所描述的行为。 使用VB6 EXE com项目,实例化一个新对象将启动一个新过程。使用.net dll(或实际上是Vb6 dll),您+不会+获得新进程。 您可能需要创建一个像VB6 exe一样公开COM对象的.net EXE,或者(听起来像您已经对此进行了调查)您需要重构EXE对象以正确处理多个实例在一个过程中。 坦白地说,最好这样做,因为像这样依赖单例通常是一种不好的代码味道。但是,紧要关头,您应该能够使用.net项目复制VB6 exe的行为。您只是无法在dll中执行此操作。     
您的中间层是在.Net中创建的吗?如果是这样,则可能会遇到这样的问题,即您的COM类是作为本机.net对象而不是COM对象创建的。解决方案通常涉及使用主要互操作程序集。看看这个SO问题,看它是否符合您的问题。     

要回复问题请先登录注册