【问题标题】:How do I marshal a C# string array to a VB6 array?如何将 C# 字符串数组编组为 VB6 数组?
【发布时间】:2011-05-11 04:07:10
【问题描述】:

我有一个使用 C# COM DLL 的 VB6 应用程序。在托管 C++ 中,我可以编写如下函数:

array<String^>^ GetAManagedArray()
{
    //Do stuff and return a managed array
}

然后我可以将返回的托管数组分配给 VB6 中的数组:

Sub MySub()
    Dim strArray() As String
    strArray = myComObject.GetAManagedArray
End Sub

这在 C++ 中运行良好,但在 C# 中 System.Array 对象是抽象的,我似乎无法找到与 C++ array&lt;&gt;^ 等效的托管对象。此外,在 C# 中,仅返回 string[] 不起作用。

什么是 C# 中等效的托管数组?

编辑:这是我的功能的确切代码
C# COM 函数:

public string[] OneTwoThree()
{
    return new string[] { "1", "2", "3" };
}

VB6函数:

Private Sub Form_Load()
    Dim test As New ComObjectCSharp
    Dim strArr(), strTemp As String
    strArr = test.OneTwoThree
    strTemp = strArr(0) & " " & strArr(1) & " " & strArr(2)
    MsgBox strTemp
End Sub

代码在VB6代码的第四行失败,错误“编译错误:无法分配给数组”

【问题讨论】:

    标签: c# com vb6 c++-cli marshalling


    【解决方案1】:

    strArr() 变量实际上不是字符串数组。它是一系列变体。修复:

    Dim strArr() As String
    strArr = test.OneTwoThree
    

    现在它和你的第一个 sn-p 一样。

    【讨论】:

    • 谢谢。现在工作!我认为在 VB 中“Dim a, b, c As String” 与 C# “string a, b, c;” 相同。没有意识到您必须为每个显式指定类型。
    【解决方案2】:

    如果您正在寻找创建数组的 C# 语法,它是 new string[5] 用于长度为 5 的数组,初始化为 null 或 new string[] { "one", "two" } 用于具有指定值的数组。

    除此之外,您还必须更具体地说明什么“不起作用”,我们才能为您提供帮助。

    【讨论】:

      【解决方案3】:

      我的猜测是 test.OneTwoThree 返回单个字符串而不是字符串数组。 尝试Dim strArr 而不是Dim strArr() 如果可行,您必须找出 C# 函数的代理的分隔符是什么 返回(有时数组的编组不需要在客户端获得正确/预期的终止 代码环境)

      【讨论】:

      • OneTwoThree 确实返回了一个字符串数组。我测试过了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多