如何在VB.NET中声明COM可见的默认索引属性?

时间:2009-07-27 14:23:39

标签: vb.net vbscript com

如何在VB.NET中声明默认索引属性,以便可以从VBScript调用?

我已尝试使用

<DispId(0)> _
Public ReadOnly Property Item(ByVal idx As Integer) As ...

但是VBScript会返回错误消息

参数数量错误或属性分配无效 错误代码800A01C2

如果我从VB.NET公开普通属性(非索引),则不会发生此错误。

以下是一个示例:

“Class1.vb:

  Public Class Class1
    Public ReadOnly Property Dogs() As Dogs
        Get
            Return New Dogs()
        End Get
    End Property
  End Class

“Dogs.vb:

  Imports System.Runtime.InteropServices

  Public Class Dogs
    <DispId(0)> _
    Public ReadOnly Property Item(ByVal idx As Integer) As Dog
        Get
            Return New Dog
        End Get
    End Property
  End Class

“Dog.vb:

  Public Class Dog
    Public ReadOnly Property Name() As String
        Get
            Return "Fido"
        End Get
    End Property
  End Class

的VBScript:

  Set obj = CreateObject("FmuComTest.Class1")

  MsgBox obj.Dogs.Item(0).Name   ' this works

  MsgBox obj.Dogs(0).Name        ' error message

访问默认的索引属性Dogs.Item(idx)会导致错误消息。

3 个答案:

答案 0 :(得分:2)

这篇MSDN博文可能会对这个问题有所了解。似乎VBScript&amp; COM对于如何调用默认值很挑剔。

http://blogs.msdn.com/ericlippert/archive/2005/08/30/458051.aspx

答案 1 :(得分:0)

在传统的VB中,我认为用于默认属性的ID是-1。不过,我不知道这对于DispId是否有任何意义。

答案 2 :(得分:0)

您需要将该属性声明为Default属性。您还需要省略DispId属性。例如:

Public Class Dogs
    Default Public ReadOnly Property Item(index As Integer) As Dog
        Get
            Return New Dog()
        End Get
    End Property
End Class

编译器会自动将DISPID 0分配给默认属性,因此不需要在属性中明确说明它。