【发布时间】:2014-05-05 12:18:06
【问题描述】:
我有一个带有 Shared 属性的 VB.NET COM 类,比如 ABC。问题是该组件被几个 C++ COM exe 使用,所以我的理解是他们每个人都会获得自己的程序集负载,并且 Shared 属性对于每个 EXE 都是唯一的。有没有办法为这个程序集获取一个跨 EXE 共享属性?
发送。
【问题讨论】:
我有一个带有 Shared 属性的 VB.NET COM 类,比如 ABC。问题是该组件被几个 C++ COM exe 使用,所以我的理解是他们每个人都会获得自己的程序集负载,并且 Shared 属性对于每个 EXE 都是唯一的。有没有办法为这个程序集获取一个跨 EXE 共享属性?
发送。
【问题讨论】:
创建一个Windows Service application 并在ROT 中注册您的共享单例对象,或者简单地使用RegisterActiveObject/RevokeActiveObject 使用唯一的guid 注册它。
因此,使用 ROT 或GetActiveObject 从任何其他位置获取此对象的 COM 代理。如果对象尚未注册,则需要手动启动 windows 服务。
更新,也可以在单例对象上实现IClassFactory(它将返回自身)。该服务将通过CoRegisterClassObject 注册单例,类似于进程外服务器行为。仍然需要初始服务激活。
最后,也许最简单的解决方案是将程序集注册为进程外DLL surrogate。我还没有尝试过,但是使用[ComRegisterFunction] / [ComUnregisterFunction] 自定义互操作注册应该很容易。
更新,这是使用代理进程的example。
【讨论】:
IClassFactory 并返回自身。该服务将通过CoRegisterClassObject 注册单例,类似于进程外服务器行为。这只是初始服务激活的问题。
您所描述的内容将通过创建进程外 COM 服务器(通常也称为 ActiveX EXE)在本机 COM 中“轻松”完成。顾名思义,进程外 COM 服务器在自己的进程中运行,并通过 COM 接口为其方法提供服务。如果多个客户端同时使用 COM 服务器,则它们都共享同一个服务器进程,因此该进程中的任何全局数据都会在所有客户端之间共享。
不幸的是,.NET 没有提供任何机制来创建进程外 COM 服务器。所有 COM 可见的 .NET 程序集都充当进程内 COM 库,因此每个使用它的客户端在他们自己的进程中都有自己的一组全局数据。
唯一的选择是创建一个标准的进程内 COM 可见库,但让它只是一个调用其他进程的传递包装器。 .NET 中的进程间通信通常使用 WCF 处理,因此典型的解决方案是让 WCF 服务在 COM 可见库与之通信的后端运行。如果您不想使用 WCF,还可以查看 .NET Remoting 或原始 TCP/IP 套接字。
这是一个小鸡抓图,可以帮助我理解我的意思:
【讨论】: