Vb.net 需要我的COM服务器的共享属性accross实例

Vb.net 需要我的COM服务器的共享属性accross实例,vb.net,com,Vb.net,Com,我有一个带有共享属性的VB.NET COM类,比如ABC。问题是组件被几个C++ COM exe所使用,所以我理解它们每个都将得到它们自己的程序集加载,并且共享属性将是每个exe唯一的。是否有方法获取此程序集的交叉EXE共享属性 Tx.通过创建进程外COM服务器(通常也称为ActiveX EXE),可以在本机COM中“轻松”完成您所描述的内容。顾名思义,进程外COM服务器在其自己的进程中运行,并通过COM接口为其方法提供服务。如果多个客户端同时使用COM服务器,则它们都共享同一个服务器进程,因此

我有一个带有共享属性的VB.NET COM类,比如ABC。问题是组件被几个C++ COM exe所使用,所以我理解它们每个都将得到它们自己的程序集加载,并且共享属性将是每个exe唯一的。是否有方法获取此程序集的交叉EXE共享属性


Tx.

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

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

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

这是一张鸡抓图,有助于形象化我的意思:

创建并在中注册共享单例对象,或者只需使用/
RevokeActiveObject
以唯一的guid注册它

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

更新后,还可以在singleton对象上实现
IClassFactory
(将返回自身)。该服务将通过
CoRegisterClassObject
注册单例,类似于进程外服务器行为。仍然需要初始服务激活

最后,也许最简单的解决方案是将程序集注册为进程外。我还没有尝试过,但是使用
[ComRegisterFunction]
/
[ComUnregisterFunction]
自定义互操作注册应该很容易


更新了,下面是一个使用代理过程的示例。

这真的很有趣。我从没听说过这个。以C#中的一个示例项目为例,该项目通过ROT注册COM对象。它与标准进程外COM服务器并不完全相同,但它完成了相同的任务。诚然,这有点混乱,但我可以想象这样做是值得的。@Stevendogart,在C#Windows服务中实现一个单例也是可能的,它将暴露
IClassFactory
并返回自身。该服务将通过
CoRegisterClassObject
注册单例,类似于进程外服务器行为。这将只是初始服务激活的问题。