我有一个带有共享属性的VB.NET COM类,比如ABC。问题是组件被几个C ++ COM exe使用,所以我的理解是他们每个都会得到自己的程序集加载,而Shared属性对每个EXE都是唯一的。有没有办法让这个程序集成为一个交叉EXE共享属性?
的Tx。
答案 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套接字。
这是一个帮助可视化我的意思的鸡图表: