问题从C#调用非托管代码

时间:2014-06-13 20:27:55

标签: c# .net com unmanaged vb6-migration

我在COM组件之间进行通信时遇到问题。

我有三个组件

  1. 应用程序A,使用
  2. Bridge,用VB6编写,可见COM
  3. 应用程序B,也是用VB6编写并公开COM接口
  4. 过去,无论谁首先启动,应用程序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的新手。

0 个答案:

没有答案