我在COM组件之间进行通信时遇到问题。
我有三个组件
过去,无论谁首先启动,应用程序A或B,都将使用VB6的CreateObject([ProgId])
函数创建一个Bridge。这似乎只创建了Bridge的1个实例,因为再次调用CreateObject([ProdId])
将返回相同的Bridge。这很好,因为应该只有一个应用程序A和一个应用程序B,它们应该共享它们调用COM的同一个桥。
现在我需要在C#中创建一个Application B版本。当我启动Application A时,创建Bridge,然后通过ProgId创建我的C#Application B,消息将通过Bridge从A发送到Application B.那很棒。问题是当我尝试从我的C#应用程序中获取Bridge时。调用Activator.CreateInstance([ProgId of Bridge])
与在VB6中调用CreateObject
的效果不同,而不是像应用程序A那样获取相同的Bridge对象,CreateInstance
返回一个未连线的新桥申请A.
事实上,新的Bridge将尝试创建一个新的A实例,如果还没有应用程序A,这将是正确的行为。
由于我无法以任何方式修改Bridge或Application A的来源,因此问题变得更加困难。我知道这个问题与在Windows中处理托管代码和非托管代码有关,并且C#代码是托管的,而应用程序A,B和桥都是用VB6编写的,因此不受管理。
我的问题是,有没有办法以某种方式找到应用程序A创建的Bridge对象 - 也就是说,是否有一些我忽略的特殊“Activator.CreateInstance()”方法?如果没有,托管和非托管COM组件之间的标准通信方式是什么。 (我试过查看管道,但这实际上意味着必须手动完成方法调用的序列化,这是我真正喜欢COM解决方案的地方)。
请让我详细说明一切,我会尽我所能;我是COM和VB6的新手。