如何开发向后兼容vb6的.net库

时间:2010-07-02 08:26:10

标签: .net vb6 asp-classic

我需要开发一个.net库,它将java web服务代理暴露给传统的vb6 asp web应用程序。作为第一次执行此类任务而不了解vb6编程语言,我需要一些经验丰富的程序员进行一些清理。 首先,我搜索了网页,我发现了以下链接(如果有人认为它有用):http://migrationguide.artinsoft.com/Migration-Guide-Faq-Chapter-14.aspx

但仍有一些事情我不清楚:

  1. Web服务代理的方法采用复杂类型(对象)参数并返回复杂类型(例如“记录”列表)。我应该如何映射thoose类型以使它们可以被vb6使用:结构或类(其中一些嵌套到其他结构中)?或简单类型的数组,最终嵌套类型的矩阵?

  2. 我认为这是obviuos我不能使用泛型,但我可以使用集合或我应该只使用数组?

  3. 我应该从我的图书馆内抛出什么样的例外? COMException?我有什么异常吗?以及vb6 Web应用程序如何使用它们:我的意思是我想提供比“和异常已经提出”更好的反馈。我发现了一些帖子,但它们很老,与旧版本的.net有关(实际上我使用的是3.5)

  4. 提前感谢您的任何帮助

2 个答案:

答案 0 :(得分:1)

最后,我发现raccomanded pratice是将库作为Com对象公开。 如果像我这样的其他初学者可能会觉得它很有用,官方msdn指南是:

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

由于数组给我带来了一些麻烦,以下提示可能会有所帮助:

  1. 数组方法参数必须由ref提供,而不是由值提供,或者在运行时获得异常
  2. 如果有属性返回或获取数组,则必须指定如何编组值
  3. 下面我已经添加msdn指南到编组数组和另一个我发现有用的帖子:

    msdn.microsoft.com/en-us/library/z6cfh6e6.aspx

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

    感谢大家提供的意见和示例

答案 1 :(得分:0)

我们最近通过编写新的WCF服务来实现这一点,这些服务以VB6可以处理的简单方式公开服务。就像你说VB6无法处理复杂类型,因为它们不是像.net那样为你做的代理生成的。所以我们的解决方案是将现有服务包装(外观?)在VB6可以调用的内容中。

我们的服务返回一个字符串,其中包含一个XML文档,该文档可以在VB6中解析为所需的对象,即返回包含10个客户端的XML文档,然后将其解析为一组Client对象。

创建WCF服务后,您需要获取WSDL并将其保存在本地或将代码指向WSDL位置,我们在尝试通过HTTPS获取WSDL时遇到了一些麻烦,这就是我们在本地保存的原因。

要使用它们,我们使用了MS的SOAP工具包。

以下是一些用于创建请求和解析结果的示例代码: -

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

您可以在代码示例中看到我们将数组,字符串,长整数和日期传递到服务调用中而没有任何问题。不能使用任何.net返回类型(除了显而易见的!)因为VB6不会理解它们是什么。您可以使用类似的设计将信息推送回服务。

关于抛出库的异常,我们只使用标准的.net代码抛出我们需要的任何异常,或允许现有的异常冒泡,你可以通过MSSOAPLib30.SoapClient30对象获得异常信息,它包含各种故障属性。

最终一切都运行良好,运行没有问题,最好的一点是VB6现在使用与其他.net客户端完全相同的功能。

希望能让您了解我们是如何做到的,并且可以帮助您做出决定。如果有任何事情没有意义,或者你想澄清其中任何一个,请告诉我。