双括号在VB6数组语法(从.net com-interop传递)

本文关键字:net com-interop 传递 语法 VB6 数组 | 更新日期: 2023-09-27 18:19:09

我有一个c# dll通过com-interop暴露给vb6。这一切都是工作,但我注意到一些奇怪的东西,当我传递一个自定义对象数组从。net到VB6。

访问数组从VB6是什么让我困惑。如果我直接访问数组我必须这样做:

Dim manager as New ObjectManager
'Access with two sets of parentheses:
msgbox manager.ReturnArrayOfObjects()(0).Name

然而,如果我先复制数组,我可以像我通常期望的那样访问它:

Dim manager as New ObjectManager
Dim objectArray() As CustomObject
'copy the array
objectArray = manager.ReturnArrayOfObjects
'access normally:
msgbox objectArray(0).Name  
在第一种情况下,我必须使用两组括号:manager.ReturnArrayOfObjects()(0).Name在第二种情况下,我可以使用一组括号:objectArray(0).Name

有人知道为什么会这样吗?也许我在互操作上做错了什么?

这里是c#互操作代码的快速存根/示例。

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("[Guid here...]")]
public interface IObjectManager
{
    [DispId(1)]
    CustomObject[] ReturnArrayOfObjects();
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("[guid here...]")]
public class ObjectManager: IObjectManager
{
    public CustomObject[] ReturnArrayOfObjects()
    {
        return new CustomObject[] { new CustomObject(), new CustomObject() };
    }
}

CustomObject()也暴露于com互操作和工作很好。请让我知道,如果你需要我张贴更多的代码,但我认为这些小片段代表的问题很好地开始。

提前感谢您的帮助。

双括号在VB6数组语法(从.net com-interop传递)

ReturnArrayOfObjects()在c#代码中是一个方法。您的VB6代码正在调用返回数组的方法,然后访问第一个元素。

msgbox manager.ReturnArrayOfObjects()(0).Name 

objectArray = manager.ReturnArrayOfObjects    
msgbox objectArray(0).Name 

是,在第二个,你调用方法本身而不访问第一个元素,并且VB允许你从方法调用中去掉括号。相反,当您直接访问第一个元素时,语言不允许省略括号。这只是一个语言特性,而不是"双括号数组语法"的问题。

ReturnArrayOfObjects是一个必须调用的方法。在VB6中,如果你调用一个方法并提供没有参数,并且它是整个语句,那么你可以省略括号。

然而,在第一个示例中,您调用该方法,然后索引到该方法返回的数组。您需要第一组括号来表示您没有向方法传递任何参数,然后第二组括号用于数组索引。