从现有的 Visual Basic 6.0 应用程序调用 .NET Framework

翻译|其它|编辑:郝浩|2006-07-12 15:14:00.000|阅读 2260 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

本文使用下列技术:
Visual Basic 6.0、Visual Basic 2005 Express、.NET Framework

可在以下地址下载代码:VBFusion05.exe (150KB)

很多开发人员认为如果他们在 Visual Basic® 6.0 中编写代码,Microsoft® .NET Framework 的广阔世界对他们来说就是禁区。但是在本文中,我将证明这种观点是错误的。我将向您介绍如何通过称为 Visual Basic Fusion 的技术从现有的 Visual Basic 6.0 应用程序中轻松地利用 .NET Framework 2.0 中的任何内容。没错,我提倡的正是使您的某些应用程序保留为 Visual Basic 6.0 的状态。然而,没有理由只是因为您选择不升级到 Visual Basic 2005,就关闭 .NET Framework 类库的大门。

那么为什么不升级呢?如果您选择将 Visual Basic 6.0 应用程序升级到 Visual Basic 2005,巨大的资源就可以任由您支配。Visual Studio® 提供了一个迁移助手,该迁移助手将自动重新编写很多 Visual Basic 6.0 代码。Microsoft 发布了一个 Visual Basic 6.0 到 Visual Basic 2005 的迁移指南,其中包括一个评估工具,可帮助确定升级应用程序所需的时间和成本。Web 上到处都是有关特定升级问题的文章、方法、提示和技巧。甚至还有一些关于该主题的书籍。有了这么多可用的资源,有人可能要问为什么代码还要保留为 Visual Basic 6.0 的状态。为什么不将所有代码都升级?

事实上,将代码从 Visual Basic 6.0 升级到 Visual Basic 2005 是一个相当费力的过程,升级是否成功主要取决于两个因素:代码质量和开发人员关于 Visual Basic 2005 和 .NET Framework 的经验。与随着时间流逝而变得杂乱的应用程序相比,结构合理且模块化程度高的应用程序升级起来要更简单。

在 Visual Basic 6.0 的世界中,很多应用程序已在生产中使用了很多年。这些应用程序可能在时间上更紧迫地需要实现功能增强。它们可能由很多开发人员进行编程,其中某些开发人员可能没有足够的时间和耐心完全理解他们正在修改的代码。不管是什么原因,编程人员通常面临使项目运行然后继续改善的压力。因此,代码在一段时间以后就会变得稍显杂乱。如果代码过于杂乱,重新编写可能要优于升级,但是重新编写也不轻松,成本也不低。

就开发人员的经验来说,将复杂且至关重要的 Visual Basic 6.0 应用程序升级到实现 Visual Basic 2005 的速度是一件很可怕的事情。在尝试升级之前熟悉 .NET 非常重要。在这方面有几个原因。如果您只是机械地将 Visual Basic 6.0 应用程序放到迁移向导的流水线上,然后开动流水线,会发现在另一头出现的是根本无法编译和运行的 Visual Basic 2005 应用程序。迁移向导将在代码标记位置(在此处迁移向导不能自动迁移)进行注释。要修复应用程序使其运行,您需要深入了解 Visual Basic 2005 和 .NET Framework。所需的代码更改有时简单而乏味,有时需要重新编写整个应用程序子系统。因此,显然升级并不总是那么轻松。

既然升级被形容为如此乏味,您可能想了解为什么人们还要进行升级。原因在于,将代码库迁移到 Visual Basic 2005 并不是一件小事,但归根结底它是在访问整个 .NET Framework 时不会导致冲突的最佳方式。我还发现利用巨大的 .NET Framework 类库和 Visual Studio 2005 提供的更高的生产力进行开发要有成效得多。Visual Studio 2005 确实使 Visual Studio 6.0 变成老古董了。进行升级时,您不得不对各个应用程序逐个作出决定。它值得付出这么多努力吗?现在做可行吗?

低成本且简单的方法
另一个选择是将应用程序保留在 Visual Basic 6.0 的状态,只在需要时调用 .NET Framework。.NET Framework 本身就包括实现下列功能的类:Ping IP 地址、检测网络连接更改、通过 FTP 传输文件、访问 COM 端口、播放声音、获取操作系统信息(如物理内存和屏幕分辨率)、获取用户和域信息、读写事件日志、访问性能计数器、启动和停止服务以及访问注册表。诸如此类,不胜枚举。当描述 .NET Framework 2.0 类库时,很容易想到“广泛”一词。通过使用 .NET Framework 2.0,您可能会消除对某些第三方控件的依赖,并删除很多 Win32® API 调用。从 Visual Basic 6.0 调用 .NET Framework 非常简单,风险也很低。这也是达到 Visual Basic 2005 编程速度的一种好方法。

要像本文中概述的那样调用 .NET Framework,您需要 Visual Studio 2005 或者 Visual Basic Express。Visual Basic Express 包括所有工具箱控件、IntelliSense®、调试程序和很多项目项。如果您想测试一下并实践使用 Visual Basic 2005,这些已经足够了。另外,Visual Basic Express 并不是限时运行的试用版。相反,它是经过缩减的 Visual Studio,旨在供您在创建的应用程序丧失其功能时使用。

您还应该下载与本文章相关的代码,特别是在您使用 Visual Basic Express 时。将包含的 ComClass.zip 文件复制到 \My Documents\Visual Studio 2005\Templates\ItemTemplates\Visual Basic 文件夹。随后,您会看到该项目项在从 Visual Basic 6.0 调用 .NET Framework 时非常关键,默认情况下,该项目项并不包含在 Visual Basic Express 中。


调用 .NET Framework
Visual Basic 6.0 在调用 COM 对象方面功能颇为强大。然而,.NET Framework 中的类并非 COM 对象,并且不能直接从 Visual Basic 6.0 调用。相反,.NET Framework 类必须通过包装调用。这些包装是使用 COM 类项生成的,它们的行为与其他 COM 对象相似。这些包装可以从 Visual Basic 6.0、Visual Basic Scripting Edition (VBScript)、Visual Basic for Applications (VBA) 或者其他与 COM 兼容的任何环境中调用。包装内部是在 Visual Basic 2005 中构建的,并且可以无缝地调用到 .NET Framework)。


图 1 Visual Basic 6.0 的 .NET 包装


构建包装是一项并不繁琐的任务。下列步骤将引导您完成为 .NET Framework 2.0 中的 Ping 功能创建 COM 可调用包装的过程。

   • 启动 Visual Studio 2005 或 Visual Basic Express。

   • 创建一个名为 FX20Wrapper 的新类库项目。

   • 选择“项目”菜单,然后选择“添加新项”。

   • 选择 COM 类项模板。对于名称,请输入 NetworkWrapper,然后单击“添加”。

   • 向 NetworkWrapper 类添加以下函数:

Public Function Ping(ByVal hostNameOrAddress As String, _Optional ByVal timeout As Integer = -1)
If timeout >= 0 Then
   Return My.Computer.Network.Ping(hostNameOrAddress, timeout)
     Else
        Return My.Computer.Network.Ping(hostNameOrAddress)
End If
End Function


大功告成!仅仅使用了几行代码,您就创建了一个 COM 对象,该对象允许您在已知环境中 Ping 每个 IPv4 地址。该函数允许您通过主机名称或 IP 地址进行 Ping。您还可以指定可选超时值。您可以想像一下各种可能性。剩下的唯一步骤是使用 Build(生成)菜单编译 Visual Basic Express 项目。IDE 编译您的项目,并生成一个 DLL,Visual Studio 将其注册为 COM 对象。

接下来,您可以构造一个使用此包装的 Visual Basic 6.0 项目。

    • 启动 Visual Basic 6.0 并创建一个新的标准 EXE 项目。

    • 在“项目”菜单上,选择“引用”,向 FX20Wrapper 添加一个引用。注意:您的 .NET 项目看起来与任何其他 COM 对象是一样的。

    • 在 Ping 按钮的 Click 事件中,添加以下代码:

Private Sub Command1_Click()
Dim network As FX20Wrapper.NetworkWrapper
Set network = New FX20Wrapper.NetworkWrapper
Text2 = Text2 & "正在 Ping " & Text1 & "..."
DoEvents
If network.ping(Text1) Then
Text2 = Text2 & "响应" & vbCrLf
Else
Text2 = Text2 & "未响应" & vbCrLf
End If
End Sub


   • 5.运行该应用程序,输入 IP 地址,并单击 Ping 按钮。您应该可以看到如图 2 所示的结果。



确定网络连接状态

人们越来越期待应用程序可以处理网络连接的意外更改。便携式计算机拔出。用户在无线环境下通信。每当网络连接或断开时,操作系统都会通知用户。如果操作系统也通知应用程序是不是会更好呢?有了 Visual Basic 2005,确实如此。每当网络连接状态更改时,My.Computer.Network 对象都会触发一个事件。图 3 中的代码显示了如何增强 NetworkWrapper 类以提供该通知。

请注意:在 New 子例程(NetworkWrapper 对象的构造函数)中,My.Computer.Network 公开了一个 Net-workAvailabilityChanged 事件。该事件不能由 COM 直接使用。相反,该事件与包装内部名为 My_NetworkAvailabilityChanged 的子例程挂接。在该例程中,将触发 COM 可使用的事件。该例程将触发自己的 NetworkAvailabilityChanged 事件,您可以看到该事件包含一个指示网络状态的简单布尔值。

从 Visual Basic 6.0 一端来看,该事件使用起来并不比 Button_Click 事件难。Visual Basic 6.0 应用程序的代码显示在图 4 中。借助于少量的代码,Visual Basic 6.0 应用程序可以快速了解网络状态。在实现该包装的实际应用程序中,当网络不可用时,状态栏可能将其状态指示为“脱机”并禁用访问网络资源的功能。


旧事物和新事物
FTP 的最初 RFC 发布于 1973 年,现在 FTP 仍是最受欢迎的通过 Internet 传输文件的协议之一。Microsoft 在过去已经通过 Microsoft Internet 传输控制和 WinInet API 为 FTP 提供了编程支持。然而,至今 .NET Framework 仍没有提供对 FTP 的本地支持。.NET Framework 2.0 通过 WebClient、FtpWebRequest 和 FtpWebResponse 类为 FTP 添加了支持。通过这些类,您可以执行多种 FTP 操作。特定操作和它们映射的 FTP 命令由 WebRequestMethods.Ftp 成员进行描述,如图 5 所示。

受文件大小和网络带宽的影响,下载文件所需的时间相差很大。为适应这种状况,FTP 类既支持同步操作也支持异步操作。同步操作对程序来说最简单,一个下载只需要两行 Visual Basic 2005 代码:

Dim w As New WebClient
w.DownloadFile(address, fileName)

然而,同步应用程序在下载操作完成之前会阻止(冻结)该应用程序。尽管此行为可能适用于命令行或者批处理操作,但是很少有用户喜欢在应用程序重新开始时未提供任何指示就停止。FTP 异步操作对单独的线程执行下载,并触发通知进度和下载完成的事件。图 6 显示 FTP 类的包装,该包装同时提供同步和异步操作。

FTPWrapper 类建立在上述概念之上。首先,该类是使用 ComClass 项目项模板生成的。这就保证了 FTPWrapper 将包含注册为 COM 对象所必需的 GUID。WebClient 的实例是在类级别上已定义维度的 WithEvents。这就允许该类中的所有方法访问该单一实例,它还允许 FTPWrapper 类处理 WebClient DownloadProgressChanged 和 DownloadFileCompleted 事件。

DownloadFile 子例程包含一行代码并执行特定文件的同步下载。如上所述,在下载文件时,调用该子例程会使应用程序停止。

对于下载文件,DownloadFileAsync 是一种更常见也更有趣的方式。该子例程首先确保没有其他的异步操作正在运行。如果有,该子例程就会引发异常,它类似于 Visual Basic 2005 中的 Err.Raise。接下来,DownloadFileAsync 使用 FtpWebRequest 类执行 SIZE FTP 命令,该命令返回请求的文件的大小(以字节为单位)。需要获得文件大小才能准确显示下载进度。最后,调用 WebClient DownloadFileAsync 函数。该函数在后台启动文件下载进程,并开始 DownloadProgressChanged 事件的常规触发。

WebClient DownloadProgressChanged 事件不能由 COM 直接使用,所以也会包装该事件。DownloadProgressChanged 的处理程序会触发新事件,该事件传递下载的字节和总文件大小的简单整数参数。Visual Basic 6.0 可以轻松使用该事件。同样,将对 DownloadFileCompleted 事件进行包装并使其可由 Visual Basic 6.0 使用。

创建包装的主要目的是使 .NET Framework 类显示为具有可轻松使用的属性、方法和事件的典型 COM 对象。FTPWrapper 实现了该目的,图 7 显示了使用 FTP 下载文件所需的 Visual Basic 6.0 代码。

启动下载与确定 FTPWrapper 类的维度和调用 DownloadFile 或 DownloadFileAsync 子例程一样简单。如果您调用 DownloadFileAsync,则 FTPWrapper 将在下载过程中触发 DownloadProgressChanged 事件并在下载完成时触发 DownloadFileCompleted 事件。DownloadProgressChanged 事件接收到目前为止下载的字节数和总文件大小。该信息是提供下载进度指示所需的所有信息。图 8 显示下载过程中的 Visual Basic 6.0 FTP 客户端。


图 3 在 Visual Basic 6.0 中实现的 FTP 客户端

本文供下载的代码包含本文所示的包装类和示例应用程序。要试验这些示例,只需下载代码并执行包含的 install.bat 文件。该操作会将包装类注册为 COM 对象。然后,您可以运行任意 Visual Basic 6.0 示例。

结论
Visual Basic 6.0 已成为又一个 COBOL。这么说并不表示对其中任何一种语言怀有恶意。COBOL 曾经非常成功,因为它使自身成为编写关键任务主机应用程序所使用的语言。当世界转向胖客户端和 GUI 时,Visual Basic 开始风光无限,成为很多业务方案勿庸置疑的最佳语言。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP