Как вернуть массив/список/коллекцию объектов из С# в VB6
Я создаю объект COM Visible С# для прокси-вызовов в веб-сервисе для приложения VB6. У меня есть метод, который возвращает массив объектов.
public DocActionReport[] DocActionReportByDateRange(System.DateTime reportStartDate, System.DateTime reportEndDate)
{
object[] results = this.Invoke("DocActionReportByDateRange", new object[] {
reportStartDate,
reportEndDate});
return ((DocActionReport[])(results[0]));
}
Когда я вызываю этот метод через VB6, вот так:
Dim proxy As New QueueMovementServiceClient.ReadQueueInfo
Dim report() As QueueMovementServiceClient.DocActionReport
report = proxy.DocActionReportByDateRange(startDate, reportEndDate)
Он успешно выполняется (я вижу, что через ведение журнала в веб-службе), но данные не возвращаются объекту в VB6 (LBound (отчет) == 0, UBound (report) == -1).
Я попробовал несколько разных подходов (изменение метода на метод void и передача коллекции в качестве параметра ref
), но до сих пор не было радости.
Что мне нужно сделать, чтобы вернуть массив объектов (список, коллекция, что угодно) потребителю VB6?
Ответы
Ответ 1
Вот трюк для вас:
- Создайте тот же самый интерфейс с объектом VB6 Com
- Импортировать эту DLL в .net
- Пользовательский рефлектор, чтобы посмотреть на сгенерированный интерфейс взаимодействия, это, надеюсь, позволит вам узнать, какие типы вам нужно вернуть, а затем вы можете просто получить объект, который не поможет вообще.
В VB6, если моя память вернулась достаточно далеко, они использовали что-то, что все еще оставляло меня с нервным подергиванием, называемым SAFEARRAY's.
SAFEARRAY, вероятно, нуждается в возвращении сюда, посмотрите на эту статью, я надеюсь, что это поможет вам (ее та же проблема)...
Как передать SAFEARRAY с С# на COM
Прочитав о SAFEARRAY, я почувствовал, что вы решите вернуть строку и будете иметь JSON и из JSON-парсеров с каждой стороны вызова;)
Ответ 2
При вызове WebService все результаты должны быть сериализованы для перемещения по HTTP.
Я рекомендую вам вернуть JSON или XML, чтобы сделать WebService более совместимым с другими платформами.