Маршаллинг системы. Массив из.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