【问题标题】:how to develop a .net library backward compatible to vb6如何开发向后兼容 vb6 的 .net 库
【发布时间】:2025-12-09 21:00:01
【问题描述】:

我需要开发一个 .net 库,它将 Java Web 服务代理暴露给旧的 vb6 asp Web 应用程序。作为我第一次执行这样的任务并且不了解 vb6 编程语言,我需要更有经验的程序员进行一些澄清。 首先,我在网上搜索并找到了以下链接(以防有人发现它有用):http://migrationguide.artinsoft.com/Migration-Guide-Faq-Chapter-14.aspx

但我还是有一些不清楚的地方:

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

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

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

提前感谢您的帮助

【问题讨论】:

  • 哎哟。这听起来是个非常糟糕的主意。让 VB6 应用程序直接与 Java Web 服务对话会容易得多,即使这涉及编写新的 VB6 代码。在中间添加 .Net 根本没有帮助。

标签: .net vb6 asp-classic


【解决方案1】:

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

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

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

  1. arrays 方法参数必须由 ref 而非值提供,否则运行时会出现异常
  2. 如果有属性返回或获取数组,您必须指定如何编组值

下面我添加了 msdn 编组数组指南和我发现有用的另一篇文章:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    创建 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 客户端完全相同的功能。

    希望这能让您了解我们是如何做到的,并且可以帮助您做出决定。让我知道是否有任何不妥之处,或者您想要澄清其中的任何内容。

    【讨论】:

    • 嗨,安迪,感谢您提供的想法,从架构的角度来看,我担心我无法重写 Web 服务,因为它是由内容管理系统公开的 soa 服务不在我的控制之下。所以最后我要编写 vb6 可以使用的包装代理类。无论如何,谢谢你的例子,而且我不知道肥皂工具包,它可能对其他项目有用。只有一个疑问:我看到它已被弃用
    • 没问题。我们没有重写现有的 Web 服务,只是在它前面添加了一个新的 :-) Soap 工具包确实使使用 Web 服务变得非常容易,而且是贬值(与 VB6 无关!)已被使用在我从事的项目中,我工作了 3 年以上,没有任何问题。还有另一个*问题可能包含您可以使用的信息-*.com/questions/122607/…-然后可能不需要soap工具包?