COM 接口类型为 IDispatch 时的默认属性

本文关键字:默认 属性 IDispatch 接口类型 COM | 更新日期: 2023-09-27 18:31:02

在 c# com 接口中,可以像这样定义默认成员

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IMyComClass
{
    [DispId(0)] string Item{get;}
}

使用 IDispatch(或双)一切都按预期工作,从 VBA 我可以省略这样的属性

Dim o1 As New MyComClass
Debug.Print o1 'this is equivalent to o1.Item

但是如果我仅将接口定义为 IUnknown,它不起作用。在 excel 对象浏览器中,我仍然看到标有"蓝点"的属性,并标记为"默认成员"。但。必须在 VBA 代码中显式指定项目。

有没有办法让 IUnknown 中的默认属性像在 IDispatch 中一样运行?

COM 接口类型为 IDispatch 时的默认属性

不,默认属性在很大程度上是一个仅适用于 IDispatch 派生接口的概念。 在 Debug.Print 语句中使用的后期绑定无法在 IUnknown 接口上工作,实现该接口的 coclass 没有调用由数字选择的函数所需的机制。

查看 IDispatch::Invoke() 方法,这是完成工作的方法。 使用默认成员只需为第一个参数传递 0 即可完成。

消除您在对象浏览器中看到的怪癖,它完全假定 COM 对象支持自动化。