我有一个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,在第二种情况下,我只需要使用1括号集: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-互操作中,并且工作得很好。如果你需要我发布更多的代码,请告诉我,但是我认为这些小片段很好地代表了这个问题。
提前谢谢你的帮助。
发布于 2011-12-30 15:16:35
ReturnArrayOfObjects()在C#代码中是一种方法。您的VB6代码正在调用方法,该方法返回数组,然后访问第一个元素。两者之间的区别
msgbox manager.ReturnArrayOfObjects()(0).Name 还有这个
objectArray = manager.ReturnArrayOfObjects
msgbox objectArray(0).Name 在第二种情况下,无需访问第一个元素就可以单独调用该方法,而VB允许您从方法调用中删除括号。相反,在直接访问第一个元素时,语言不允许您去掉括号。这只是一个语言特性,不是“双括号数组语法”问题。
发布于 2011-12-30 15:17:39
ReturnArrayOfObjects是一个必须调用的方法。在VB6中,如果您调用一个方法而不提供任何参数,并且它是整个语句,那么您可以省略括号。
但是,在第一个示例中,您将调用该方法,然后将其索引到该方法返回的数组中。您需要第一组括号来表示您没有向该方法传递任何参数,然后第二组括号用于数组索引。
https://stackoverflow.com/questions/8680875
复制相似问题