我有一个现有的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
答案 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作为参数,如果文档正确,也可以使用。)