需要在我的COM服务器实例之间共享属性

时间:2014-03-26 20:18:06

标签: vb.net com

我有一个带有共享属性的VB.NET COM类,比如ABC。问题是组件被几个C ++ COM exe使用,所以我的理解是他们每个都会得到自己的程序集加载,而Shared属性对每个EXE都是唯一的。有没有办法让这个程序集成为一个交叉EXE共享属性?

的Tx。

2 个答案:

答案 0 :(得分:2)

创建Windows Service application并在ROT中注册您的共享单例对象,或者只使用RegisterActiveObject / RevokeActiveObject将其注册为唯一的guid。

因此,使用ROT或GetActiveObject从任何其他地方获取此对象的COM代理。如果对象尚未注册,则需要手动启动Windows服务。

更新了,也可以在单例对象上实现IClassFactory(它将自行返回)。该服务将通过CoRegisterClassObject注册单例,类似于out-of-proc服务器行为。仍然需要初始服务激活。

最后,也许最简单的解决方案是将程序集注册为一个不合时宜的DLL surrogate。我没有尝试过,但[ComRegisterFunction] / [ComUnregisterFunction]自定义互操作注册应该很容易。

已更新,此处是使用代理流程的example

答案 1 :(得分:1)

通过创建进程外COM服务器(通常也称为ActiveX EXE),可以在本机COM中“轻松”完成所描述的内容。顾名思义,进程外COM服务器在其自己的进程中运行,并通过COM接口提供它的方法。如果多个客户端同时使用COM服务器,它们都共享相同的服务器进程,因此该进程中的所有全局数据都在所有客户端之间共享。

不幸的是,.NET没有提供任何创建进程外COM服务器的机制。所有COM可见.NET程序集都充当进程内COM库,因此使用它的每个客户端在其自己的进程中都有自己的全局数据集。

唯一的选择是创建一个标准的进程内COM可见库,但它只是一个传递包装器,它调用了其他一些进程。 .NET中的进程间通信通常使用WCF进行处理,因此典型的解决方案是在后端运行WCF服务,COM可见库与之通信。如果您不想使用WCF,还可以查看.NET Remoting或原始TCP / IP套接字。

这是一个帮助可视化我的意思的鸡图表:

enter image description here

相关问题