首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过COM使用VB.net集合类返回错误:“类不支持自动化”

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

Stack Overflow用户
提问于 2015-02-23 12:38:17
回答 1查看 2.2K关注 0票数 0

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

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

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

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

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

代码语言:javascript
复制
<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中的示例测试代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 13:20:12

好的,问题是索引器重载了,您不应该在COM可见接口:https://msdn.microsoft.com/en-us/library/ms182197.aspx中使用索引器。

从页面中提取重载方法发生的情况:

当向COM客户端公开重载方法时,只有第一个方法重载保留其名称。随后的重载通过在名称中附加一个下划线字符'_‘和一个与重载声明顺序相对应的整数来唯一地重命名。例如,请考虑以下方法。 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); VisualBasic6COM客户端不能使用名称中的下划线来实现接口方法。

因此,要使用字符串索引器,我必须编写:

代码语言:javascript
复制
wscript.echo comObj.OutputCol.Item_3("FirstCol")

(Item_2接受一个对象作为参数,如果文档是正确的,它也会工作)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28674011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档