DispID在接口之间必须是唯一的吗?

jeb*_*jeb 6 c# com

我使用COM与旧的VB6应用程序.

我更改了我的代码以在接口中使用DispID,因为它似乎比使用更好[ClassInterface(ClassInterfaceType.AutoDual)].

但它是否允许从DispID(1)计数的每个接口开始,即使一个类使用两个接口?

这种方式稳定吗?或者我错过了什么?

[ComVisible(true)]
[Guid("9E1125A6-...")]
public interface IMyInterface1
{
    [DispId(1)]
    string Name1 { get; }
}

[ComVisible(true)]
[Guid("123425A6-...")]
public interface IMyInterface2
{
    [DispId(1)]
    string Name2 { get; }
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
class MyClass : IMyInterface1, IMyInterface2
{
    public string Name1 { get { return "Name1"; } }
    public string Name2 { get { return "Name2"; } }
}
Run Code Online (Sandbox Code Playgroud)

Rom*_* R. 6

是否允许从DispID(1)计数的每个接口开始,即使一个类使用两个接口?

DISPID只能在界面中唯一.你最好使用两个接口,每个接口都有自己的(不同的)DISPID 1属性,即使两个接口都是由同一个COM对象实现的.

但是,由于提到了VB6,您需要记住VB6不会喜欢在同一个COM对象上实现的2个以上的调度接口,并且可能只"看到"第一个/主要对象.也就是说,问题不是DISPID冲突(根本不是问题),而是VB6无法正常使用暴露2+双接口的对象.MSDN在多个双接口中描述的原因:

由于只公开一个IDispatch接口,因此只能通过IDispatch接口访问对象的客户端将无法访问任何其他接口中的方法或属性.

遗憾的是,这是VB6的情况.与更高级的环境不同,它以"任何其他接口中的方法或属性"不可访问的方式查询接口.虽然分配不同的DISPID不会有帮助.