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

时间:2014-11-19 11:29:21

标签: c# vba com interop idispatch

在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对象浏览器中,我仍然看到标有“蓝点”标记的属性,并标记为'默认成员'。但是.Item必须在VBA代码中明确指定。

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

1 个答案:

答案 0 :(得分:4)

不,默认属性是一个只能应用于IDispatch派生接口的概念。您在Debug.Print语句中使用的后期绑定无法在IUnknown接口上运行,实现该接口的coclass没有调用由数字选择的函数所需的机制。

查看IDispatch::Invoke() method,这是完成工作的那个。使用默认成员只需通过为第一个参数传递0来完成。

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