Как вернуть массив / список / коллекцию объектов из C # в VB6 - PullRequest
11 голосов
/ 12 июля 2010

Я создаю объект COM Visible C # для прокси-вызовов к веб-сервису для приложения 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 (отчет) == -1).

Я испробовал несколько разных подходов (изменив метод на метод void и передав коллекцию в качестве параметра ref), но пока без радости.

Что мне нужно сделать, чтобы вернуть массив объектов (список, коллекция, что угодно) потребителю VB6?

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Вот вам хитрость:

  1. Создайте точно такой же интерфейс с VB6 Com Object
  2. Импортируйте этот dll в .net
  3. Пользовательский рефлектор для просмотрав сгенерированном интерфейсе взаимодействия это, надеюсь, позволит вам увидеть, какие типы вам нужно возвращать, затем снова вы можете просто получить объект, который вообще не поможет.

В VB6, если память уходитдостаточно далеко, они использовали что-то, что до сих пор вызывает у меня нервную дрожь под названием SAFEARRAY.

SAFEARRAY - это, вероятно, то, что нужно вернуться сюда, взгляните на эту статью, я надеюсь, что она поможет вам (та же проблема) ...

Как передать SAFEARRAY из C # в COM

Прочитав о SAFEARRAY, я понял, что вы решите вернуть строку и иметь toJSON ипарсеры fromJSON на каждой стороне вызова;)

0 голосов
/ 19 октября 2010

При вызове WebService все результаты должны быть сериализованы для прохождения через HTTP.

Я рекомендую вам вернуть JSON или XML , чтобы сделать WebService болеесовместим с другими платформами.

...