c# - 将 .NET ArrayList 编码到 VB6 [Com interop]

标签 c# com vb6 interop marshalling

我有一个相对简单的 C#class,我想将其编码到 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 SafeArray。

关于c# - 将 .NET ArrayList 编码到 VB6 [Com interop],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495861/

相关文章:

batch-file - 将 .bat 文件中变量的内容传输到 VB 中的变量

c# - 具有异步和同步需求的数据访问

c# - 在 jqGrid 中,读取与保存单个属性/列是否有不同的值?

c# - 具有多个 GroupBy 要求的多重联接的 LINQ 扩展方法

c++ - 使用 VC++ 以编程方式从 Excel 复制单元格

c++ - 在 C++ 中使用 INetwork::GetNetworkConnections()

python - comtypes 中的 COM 对象 VARIANT 参数(python)

c# - 如何使用 C# 比较两个 Json 对象

listview - 带有 ComCtl32.ocx ListView 的 VB6 表单导致 Windows 8 上的应用程序崩溃

Java (JNA) dll 的引用传递