[英]COM-Interop assembly not finding a native (.Net) dependancy when called from Vb
[英]Double parentheses in VB6 Array syntax (passed from .Net com-interop)
我有一个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#interop代码的快速存根/示例。
[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-interop并且正常工作。 如果您需要我发布更多代码,请告诉我,但我认为这些小片段代表了这个问题。
在此先感谢您的帮助。
C#代码中的ReturnArrayOfObjects()
是一种方法。 您的VB6代码正在调用该方法,该方法返回数组,然后访问第一个元素。 这个区别
msgbox manager.ReturnArrayOfObjects()(0).Name
和这个
objectArray = manager.ReturnArrayOfObjects
msgbox objectArray(0).Name
在第二个中,您在不访问第一个元素的情况下自己调用方法,VB允许您从方法调用中省略括号。 相反,当您直接访问第一个元素时,该语言不允许您放弃括号。 它只是一种语言功能,它不是“双括号数组语法”问题。
ReturnArrayOfObjects
是一个必须被调用的方法。 在VB6,如果你调用一个方法并提供任何参数,它是整个语句,那么你可以省略括号。
但是,在第一个示例中,您将调用该方法,然后索引到该方法返回的数组。 您需要第一组括号表示您没有向方法传递任何参数,然后第二组括号用于数组索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.