我的课程如下
[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可见接口吗?
答案 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()