2

我有一个 .Net 组件,它有一个 COM 可见类和一个返回 System.Array 的方法。在后台,它返回一个字符串数组,但返回类型声明为 System.Array。不要问我“为什么”,我知道我可以将返回类型声明为 string[],这很好,但我的问题是特别是当它返回 System.Array 时。因此,为简单起见,.Net 方法如下:

public Array GetData()
{
    return new string[] { };
}

然后在 VB6 项目中,无论我如何尝试,我都无法将数组元素作为字符串访问和遍历。下面是我的 VB6 代码片段,它不起作用:

Dim objRetVal As Object
Dim resData As Variant
Dim strData As String

Set objRetVal = NetClassInstance.GetData()

For Each resData In objRetVal
    strData = CStr(resData)
    MsgBox "strData = " & strData
Next

上面的 NetClassInstance 是我的 .Net 组件中 COM Visible .Net 类的一个实例。所以,它总是失败,它不可能将 System.Array 编组为 VB6 的字符串数组,我可以循环和访问数组中的字符串。请注意,objRetVal 不是 Nothing 也不是空的,它有数据,只是 resData 不读取数组中的字符串值。

我知道如果我从我的 .Net 方法返回字符串数组,那么它很可能会在 VB6 端工作,但我想知道是否有办法进行正确的编组并将返回的 System.Array 转换为 string() 数组VB6侧。

4

2 回答 2

2

我需要做的就是遵循 Hans 和 xxbbcc 的评论,这些评论让我知道了运行代码所需的内容。因此,我用以下 return:MarshalAs 标签装饰了我的方法,它对我来说效果很好:

[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
public Array GetData()
{
    return new string[] { };
}

谢谢大家的支持意见。

于 2016-09-06T21:02:25.387 回答
0

除非我错过了什么,否则您似乎没有为“resdata”设置任何值,因此返回的字符串为空。

For Each resData In objRetVal ''Nothing to tie resdata to...
  strData = CStr(resData) ''resdata is already empty, returning nothing here...
  MsgBox "strData = " & strData
Next

看到您正在使用对象“resdata”应该类似于 -

resData = objRetVal.StringReturned  ''Whatever the return name might be...  

For Each resData In objRetVal ''Now has a value...
  strData = CStr(resData) ''Returning your query...
  MsgBox "strData = " & strData
Next
于 2016-09-06T16:41:40.387 回答