将.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会封送。我是缺少一个属性,还是其他什么?
没有必要提供替代解决方案,因为我之所以这么问,是因为我想知道如何做到这一点,而不是因为如果我能做到的话,我没有替代方案。谢谢
处理此问题的一种方法是使用COM SafeArray将数据从.NET来回传递到COM。我使用此技术的运气比使用ArrayList要好。您的消息声明可能看起来像:
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
public string[] Messages
这可以在VB6或类似的COM客户端中看到
Public Messages() as String
字符串的COM安全数组。