Как разработать. NET библиотеки обратно совместимы с VB6 - PullRequest
2 голосов
/ 02 июля 2010

Мне нужно разработать библиотеку .net, которая предоставляет прокси-сервер веб-службы java устаревшему веб-приложению vb6 asp. Поскольку я впервые делаю такую ​​задачу и не знаю языка программирования vb6, мне нужны разъяснения более опытных программистов. Для начала я искал в Интернете и нашел следующую ссылку (на случай, если кто-то может найти ее полезной): http://migrationguide.artinsoft.com/Migration-Guide-Faq-Chapter-14.aspx

все же есть некоторые вещи, которые мне не ясны:

  1. методы прокси-сервера веб-службы принимают параметры сложных типов (объектов) и возвращают сложные типы (например, список «записей»). Как я должен отобразить типы thoose, чтобы сделать их пригодными для использования vb6: структурами или классами (некоторые из них вложены в другие структуры)? или массивы простых типов, в конечном итоге матрицы для вложенных типов?

  2. Я думаю, что это очевидно, я не могу использовать дженерики, но могу ли я использовать коллекции или я должен использовать только массивы?

  3. какие исключения я должен выбросить изнутри моей библиотеки? COMException? Любое исключение я желаю? и как веб-приложение vb6 потребляет их: я имею в виду, что я хотел бы дать лучшую обратную связь, чем "и было возбуждено исключение". я нашел несколько постов, но они довольно старые и имеют отношение к более старой версии .net (на самом деле я использую 3.5)

Заранее спасибо за любую помощь

Ответы [ 2 ]

1 голос
/ 08 июля 2010

В конце концов я обнаружил, что raccoaged pratice представляет библиотеку как объект Com.В случае, если другие новички, такие как я, могут найти это полезным, официальное руководство msdn:

msdn.microsoft.com / en-us / library / zsfww439 (v = VS.71) .aspx

Поскольку массивы доставили мне немало хлопот, могут быть полезны следующие подсказки:

  1. Параметр метода массивов должен быть предоставлен ref, а не значением, иначе вы получите исключение во время выполнения
  2. если есть свойства, возвращающие или получающие массивы, вы должны указать, как упорядочить значения

ниже, я добавил руководство по msdn для маршалинга массивов и еще один пост, который я нашел полезным:

msdn.microsoft.com / ru-ru / library / z6cfh6e6.aspx

huntjason.spaces.live.com / blog / cns! 9D2E96F2AA6AE85F! 378.entry

спасибо всем за мненияи предоставленные примеры

0 голосов
/ 02 июля 2010

Мы сделали это недавно, написав новые сервисы WCF, которые предоставляют сервис простым способом, который может обрабатывать VB6. Как вы говорите, VB6 не может обрабатывать сложные типы, так как они не генерируются прокси-сервером, как .net сделает для вас. Таким образом, наше решение заключалось в том, чтобы обернуть (фасад?) Существующий сервис во что-то, что может вызвать VB6.

Наш сервис вернул строку, которая содержала XML-документ, который можно было проанализировать в VB6 в требуемый объект, то есть вернуть XML-документ, содержащий 10 клиентов, а затем проанализировать его в коллекции клиентских объектов.

Как только служба WCF была создана, вам нужно захватить WSDL и сохранить его локально или указать код в местоположении WSDL, у нас возникли некоторые проблемы при попытке получить WSDL через HTTPS, поэтому мы сохранили его локально.

Для их использования мы использовали SOAP инструментарий от MS.

Вот пример кода для создания запроса и анализа результата: -

Set m_ServiceClient = New MSSOAPLib30.SoapClient30

With m_ServiceClient
  .MSSoapInit "c:\service.wsdl"
  .ConnectorProperty("Timeout") = "30000"
End With

lLoading = ParseResultToLoading(m_ServiceClient.GetLoadingByCountryIdProductId(llProductId, _
                                                                             Countries(), _
                                                                             Duration, _
                                                                             lsTravellerType, _
                                                                             Traveller.MedicalScore, _
                                                                             Traveller.InitialAmount, _
                                                                             Traveller.AdditionalWeekAmount, _
                                                                             IssueDate))


Private Function ParseResultToLoading(XMLString As String) As Loading

  Dim x As Loading
  Dim objXML As New MSXML2.DOMDocument
  Dim objElem As MSXML2.IXMLDOMElement

  If Not objXML.LoadXML(XMLString) Then
      Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason
  End If

  Set objElem = objXML.selectSingleNode("//LoadingInfo")

  Dim objSub As MSXML2.IXMLDOMElement

  ' iterate its sub-nodes
  For Each objSub In objElem.childNodes

      Select Case UCase$(objSub.tagName)
          Case "FIXED"
              x.Fixed = objSub.Text
          Case "FIXEDNET"
              x.FixedNet = objSub.Text
          'any other values that are required...
      End Select

  Next

  ParseResultToLoading = x

End Function

Вы можете увидеть в примере кода, что мы без проблем передали массивы, строки, long и даты в вызов службы. Не могу использовать никакие типы возврата .net (кроме очевидных!), Так как VB6 не поймет, что это такое. Вы можете использовать аналогичный дизайн для передачи информации обратно в сервис.

Что касается исключений для выброса в вашу библиотеку, мы просто использовали стандартный код .net для выброса любых исключений, которые нам нужны, или позволяли существующим исключениям всплывать, и вы можете получить информацию об исключениях через объект MSSOAPLib30.SoapClient30, в котором содержатся различные свойства ошибок.

В конце концов, все работало очень хорошо, проблем с запуском не было, и лучше всего то, что VB6 теперь использует те же функции, что и другие клиенты .net.

Надеюсь, это даст вам представление о том, как мы это сделали, и что это может помочь вам в ваших решениях. дайте мне знать, если что-то не имеет смысла, или вы хотите получить разъяснения по любому из них.

...