将.NET ArrayList封送至VB6[Com interop]

本文关键字:Com interop VB6 NET ArrayList | 更新日期: 2023-09-27 18:27:30

我有一个相对简单的C#类,我想将它封送到VB项目中。它看起来是这样的(我为这篇文章简化了一点):

[Guid("AAAAAAAA-AAAA-AAAA-AAAA-123456789ABC", ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]
[ProgId("MyBiz.MyResponse")
[Serializable]
public class MyResponse
{
    public bool Success { get; set; }
    public int ID{ get; set; }
    public string Location{ get; set; }
    public ArrayList Messages { get; set; }
}

消息包含0个或多个字符串。我编译了这个并创建了一个类型库供VB6使用。从简单类型传递的数据来看,一切都很好,但Messages变量虽然VB运行时将其识别为ArrayList,但即使在应该包含数据的情况下,它也不包含任何数据。在整理数据方面,我缺少什么?我知道泛型不会封送,但我相信ArrayList会封送。我是缺少一个属性,还是其他什么?

没有必要提供替代解决方案,因为我之所以这么问,是因为我想知道如何做到这一点,而不是因为如果我能做到的话,我没有替代方案。谢谢

将.NET ArrayList封送至VB6[Com interop]

处理此问题的一种方法是使用COM SafeArray将数据从.NET来回传递到COM。我使用此技术的运气比使用ArrayList要好。您的消息声明可能看起来像:

[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
public string[] Messages

这可以在VB6或类似的COM客户端中看到

Public Messages() as String

字符串的COM安全数组。