将.NET ArrayList编组为VB6 [Com interop]

时间:2014-10-21 20:37:31

标签: c# com vb6 interop marshalling

我有一个相对简单的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使用的类型库。就简单类型传递的数据而言,一切都运行良好,但是当VB运行时将其识别为ArrayList时,Messages变量即使应该也不包含任何数据。在编组数据方面,我错过了什么?我知道泛型不会编组,但我相信ArrayList可以。我错过了一个属性,还是别的什么?

我不需要提供替代解决方案,因为我想问这个,因为我想知道如何去做,不是因为我没有替代方案,如果我可以让它工作。谢谢!

1 个答案:

答案 0 :(得分:1)

处理此问题的一种方法是使用COM SafeArray将数据从.NET传递到COM。我使用这种技术比使用ArrayList更好运。您的消息的声明可能如下所示:

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

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

Public Messages() as String

一个COM SafeArray of Strings。