Маршаллинг системы. Массив из.Net в vb6

У меня есть компонент.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 является экземпляром класса COM Visible .Net в моем компоненте.Net. Таким образом, он все время терпит неудачу, никоим образом он не может вывести System.Array в строковый массив для VB6, который я могу зациклить и получить доступ к строкам в массиве. Обратите внимание, что objRetVal не является Nothing и не пуст, у него есть данные, просто resData не читает строковое значение в массиве.

Я знаю, что если я верну строковый массив из моего метода.Net, то, скорее всего, он будет работать на конце VB6, но я хочу знать, есть ли способ сделать правильный маршалинг и преобразовать возвращенный System.Array в массив string() на Сторона VB6.

2 ответа

Все, что мне нужно было сделать, это следовать комментариям Ганса и xxbbcc, которые подсказали мне, что нужно для запуска кода. Итак, я украсил свой метод следующим тегом return:MarshalAs, и он хорошо сработал для меня:

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

Спасибо всем за положительные комментарии.

Если я что-то не пропустил, кажется, что вы не установили никакого значения в "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
Другие вопросы по тегам