Как вернуть массив/список/коллекцию объектов из С# в 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 более совместимым с другими платформами.