通过COM使用VB.net Collection类返回错误:“类不支持自动化”

时间:2015-02-23 12:38:17

标签: vb.net com

我有一个现有的VB.net类库,它有一个VB类Collection类的公共属性。我将类库公开为COM对象,以便能够在进行中使用它。

当我使用整数索引(例如comObj.OutputCol.Item(1))访问Collection-property时,它工作正常,但是当我尝试使用字符串索引器(例如comObj.OutputCol.Item("FirstCol"))时,我收到以下错误(来自我用来测试的VBScript:

  

错误消息:类不支持自动化
  错误代码:800A01AE

是否可以通过COM以任何方式使用字符串索引器?

示例代码,COM-object i VB.net:

<ComClass(TestClass.ClassId, TestClass.InterfaceId, TestClass.EventsId)>
Public Class TestClass
    Public Const ClassId As String = "063CA388-9926-44EC-B3A6-856D5299C210"
    Public Const InterfaceId As String = "094ECC57-4E84-423A-B20E-BD109AEDBC20"
    Public Const EventsId As String = "038B18BD-54B4-42D3-B868-71F4C52345B0"

    Private _sOutputCol As Collection = Nothing
    Private Property sOutputCol() As Collection
        Get
            If _sOutputCol Is Nothing Then
                _sOutputCol = New Collection()
            End If
            Return _sOutputCol
        End Get
        Set(ByVal Value As Collection)
            _sOutputCol = Value
        End Set
    End Property

    Public ReadOnly Property OutputCol() As Collection
        Get
            Return sOutputCol
        End Get
    End Property

    Public Sub New()
        sOutputCol.Add("First object", "FirstCol")
        sOutputCol.Add(2, "SecondCol")
    End Sub

End Class

VBScript中的示例测试代码:

Set comObj = WScript.CreateObject("VbComTest.TestClass")
wscript.echo comObj.OutputCol.Item(1) ' Works
wscript.echo comObj.OutputCol.Item(CStr("FirstCol")) ' Gives the error

我已使用>regasm "...path...\VbComTest.dll" /codebase

注册了dll

1 个答案:

答案 0 :(得分:1)

好的,问题是索引器过载,你不应该在COM可见界面中使用它:https://msdn.microsoft.com/en-us/library/ms182197.aspx

从页面中提取有关重载方法的内容:

  

当重载方法暴露给COM客户端时,只有第一个   方法重载保留其名称。后续的重载是唯一的   通过在名称旁边添加一个下划线字符&#39; _&#39;和   对应于重载声明顺序的整数。   例如,请考虑以下方法。

     

void SomeMethod(int valueOne); void SomeMethod(int valueOne,int   valueTwo,int valueThree); void SomeMethod(int valueOne,int   valueTwo);

     

如下所示,这些方法将暴露给COM客户端。

     

void SomeMethod(int valueOne); void SomeMethod_2(int valueOne,   int valueTwo,int valueThree); void SomeMethod_3(int valueOne,int   valueTwo);

     

Visual Basic 6 COM客户端无法使用实现接口方法   名称中的下划线。

所以要使用字符串索引器,我必须写:

wscript.echo comObj.OutputCol.Item_3("FirstCol")

(Item_2将Object作为参数,如果文档正确,也可以使用。)