我可以让两个类在COM中实现相同的接口吗?

时间:2011-09-17 08:42:31

标签: .net vb6 com-interop

我的课程如下

[ComVisible(True)][GUID(...)]
public interface IMyComInterface
{
   void DoThis(string[] params);
}

[ClassInterface(ClassInterfaceType.None)]
[GUID(...)]
public class MyComImplementation: MyNetClass,IMyComInterface
{
   public void DoThis(string[] params)
   {
      var netParams=params.ToList();
      base.DoThis(netParams);
   }
}

这有效。

现在我想添加第二个继承MyNetBaseClass但使用过滤器的ComClass:

[ClassInterface(ClassInterface.Type.None)
[GUID(...)]
public class MySecondComImplementation:MyNetClass,IMyComInterface
{
   public void DoThis(string[] params)
   {
      var netParams=params.Where(param=>param.Contains("x"));
      base.DoThis(netParams.ToList());
   }
}

这是否有效,或者我是否必须使用相同的DoThis方法定义第二个MyComInterface?或者换句话说:每个实现COM-Visible接口的类都必须拥有自己独特的COM可见接口吗?

2 个答案:

答案 0 :(得分:2)

让多个对象实现相同的接口是完全合法的。但是您通过其GUID注册COM dll。当您想要实例化COM对象时,Windows会调用DllGetClassObject入口点函数,并将其传递给所需的类ID。

因此,此函数的作用类似于COM对象的工厂。如果您编写自己的此函数版本,则可以选择要创建和返回的对象。

我必须承认我对VB6知之甚少,不知道是否可以导出您自己的DllGetClassObject版本来执行此操作。

答案 1 :(得分:2)

您展示的示例完全合法。 这两个类将各自拥有自己的GUID。通过注册程序集,必要的条目将写入注册表。

在VB应用程序中,您将能够执行此操作。 (对不起,下面的代码中可能存在语法错误,我没有足够的VB6知识:))。

Dim a As IMyComInterface
Dim b As IMyComInterface

Set a = New MyComImplementation()
Set b = New MySecondComImplementation()