同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

时间:2021-05-28 00:03:02
 
本页内容
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 概述
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 了解 Visual Basic 6 和 Visual Basic .NET 运行库
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 调入框架
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 用 Visual Basic .NET 创建包装
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 比较各种方法
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 使用简单代码
同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法 小结

概述

许 多组织都有一个重要的 Microsoft Visual Basic 6 代码基,并且试图就该旧式代码作出最好的决断。在决定如何处理 Visual Basic 6 应用程序时,基本有三种选择。可以维持 Visual Basic 6 应用程序的现状,而无需向该旧式应用程序中加入任何新技术。可以将 Visual Basic 6 应用程序完全迁移到 Visual Basic .NET 中。或者,可以保留您的 Visual Basic 6 代码,与 Visual Basic .NET 进行交互,以便轻松地将 .NET Framework 中的任何功能添加到现有应用程序中。本文将讨论最后一种最佳做法(称为 Visual Basic Fusion)。

了解 Visual Basic 6 和 Visual Basic .NET 运行库

Visual Basic 6 应用程序本质上是 COM 应用程序。当您想在 Visual Basic 6 中执行某些操作(如访问数据库或生成用户接口)时,需要添加对适当 COM 组件的引用,然后使用它包含的功能。通常,其他应用程序还通过 COM 组件公开功能。例如,Visual Basic 6 应用程序可以使 Microsoft Word 或 Excel 自动运行,因为这些应用程序公开了 COM 接口。

Visual Basic .NET 应用程序不基于 COM,默认情况下不公开 COM 接口。Visual Basic .NET 应用程序访问 .NET 类库中的功能。Microsoft .NET Framework 包括上千个类库,这些类库允许 Visual Basic .NET 应用程序与数据库通信,访问 Internet、注册表、文件系统、事件日志、系统信息等。.NET Framework 类库 (FCL) 中可用功能的数量远大于 Visual Basic 6 中可用功能的数量。

Visual Basic 6 和 Visual Basic .NET 建立在互不兼容的技术之上。Visual Basic 6 应用程序可以访问 .NET 类库,但要这么做,它必须借助互操作层,即客户端可调用的包装。这将包装所需的 .NET 类并将其公开,以便该类如传统的 COM 对象那样,可以在任何可以使用 COM 对象的环境(Visual Basic 6、Visual Basic 5、ASP、VBA、VBScript 等)中使用。

调入框架

Using the .NET Framework Class Library from Visual Basic 6 文章中所述,调入 .NET Framework 的第一步是将所需的 .NET Framework DLL(称作程序集)注册为 COM 对象。这可以通过 .NET Framework SDK 提供的 regasm 命令行工具实现,.NET Framework SDK 是作为 Visual Basic Express 产品的一部分安装的。如果您尚未安装 Visual Studio 2005,强烈建议您下载并安装免费的 Visual Basic Express。

演练 1. 注册 System.dll 以便可以在 Visual Basic 6 中使用

1.

导航到 Start | Run

2.

Run 对话框中,输入 CMD,然后单击 OK

3.

输入 cd C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727

4.

输入 regasm system.dll

注册程序集之后,即可在 Visual Basic 6 中添加对它的引用,如同它是任何其他 COM 对象一样:

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 1. 在 Visual Basic 6 中添加对 system.dll 的引用

而 且,Visual Basic 6 将能够调入 System.dll .NET 程序集,因为已经为它创建了 COM 可调用包装。然而,要使 .NET 类及其功能出现在 COM 可调用包装中,.NET 类必须遵循一组相当严格的规则。因此,System.dll 中只有很少一部分类可以在 Visual Basic 6 中直接调用。在 Visual Basic 6 中可以调用的一个函数是 WebClient.DownloadFile 函数。

清单 1. 在 Visual Basic 6 中调用 DownloadFile 函数

Dim webDownload As System.WebClient
Set webDownload = New System.WebClient
webDownload.downloadFile _
"http://www.ssec.wisc.edu/data/west/latest_westir.jpg", _
App.Path & "/latest_westir.jpg"

用 Visual Basic .NET 创建包装

前 面的示例不应该制造这样的假相:您只需使用 Regasm 和任何 .NET 程序集,Visual Basic 6 就能使用所有 .NET 功能。几乎在所有情况下,如果您要调入 .NET Framework、第 3 方 .NET 组件或开放的源 .NET 库,都必须编写 Visual Basic .NET 包装类。原因是,.NET 类必须遵循相当严格的规则才能将它自己正确地表现为 COM 对象,大多数 .NET 类并不遵循这些规则。

要使用 .NET 功能,您需要在 Visual Basic .NET 中创建一个确实遵循 COM 互操作性规则的类,该类代表 Visual Basic 6 应用程序调入所需的 .NET 代码。

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 2. 通过 Visual Basic .NET 包装类在 Visual Basic 6 中调入 .NET Framework

简单的包装类

如 需简单的示例,请考虑 .NET Framework Guid 类。GUID 是“全局唯一标识符”(Globally Unique Identifier)。GUID 在 Windows 中的许多地方用于唯一标识 COM 对象、文件、用户,以及几乎其他任何内容。它们采取字符串形式,如:13427d57-ccb5-42fd-91f7-b49d4c2ae9a3。关于 GUID 重要的是,如果您正确地生成了一个 GUID,绝对可以 100% 地确定没有其他人会生成相同的 GUID。

在 Visual Basic 6 中没有生成 GUID 的简单方法,但 Visual Basic .NET 中只需要一行代码:

清单 2. 在 Visual Basic .NET 中生成 GUID

Dim g as Guid = Guid.NewGuid()

遗憾的是,Guid 类不是用这种可以在 Visual Basic 6 中直接调用的方式创建的。要在 Visual Basic 6 中使用该功能,您需要创建一个非常简单的 Visual Basic .NET 包装类。该 Visual Basic .NET 包装类将自己作为 Visual Basic 6 可以使用的 COM 对象公开,并将所需的调用放入 .NET Framework Guid 类中。

Can I Interest you in 5000 Classes”中包括了有关创建包装类的详细信息,但在此要重复一些基本知识:

演练 2. 创建 Guid 类的 Visual Basic .NET 包装

1.

下载并解压缩本文的示例代码

2.

ComClass.zip 文件复制到 C:/Documents and Settings/[User Name]/My Documents/Visual Studio 2005/Templates/ItemTemplates/Visual Basic 中。

如 果您使用的是 Visual Studio 2005,可以跳过步骤 2。然而,Visual Basic Express 默认情况下不包括 COM 类模板,该模板对于将 .NET Framework 作为 COM 对象公开非常有用。通过将 ComClass.zip 文件复制到该文件夹中,COM 类模板将对 Visual Basic Express 可用。

3.

Visual Basic Express 中,选择 File | New Project 菜单命令。

4.

New Project 对话框中:

1.

对于 Template,选择 Class Library

2.

对于 Name,输入 NetFxWrapper。该名称将成为组件的名称,并将出现在 Visual Basic 6 中可用的引用列表中。

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 3. 在 Visual Basic .NET 中创建包装项目

5.

单击 OK

6.

Solution Explorer 中,删除 Class1

7.

选择 Project | Add New Item 菜单命令。

8.

Add New Item 对话框中:

1.

对于 Templates,选择 COM Class

2.

对于Name 字段,输入 GuidWrapper

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 4. 创建 Visual Basic .NET 包装 COM 类

9.

单击 Add

10.

line 20(在 End Sub 后,End Class 前)上输入以下内容:

清单 3. Visual Basic .NET 中的包装函数

    Public Function NewGuid() As String
Dim g As Guid = Guid.NewGuid()
Return g.ToString()
End Function

该函数将创建一个 Guid 类的实例,并将它赋给新生成的 Guid 值。然后,该函数将 Guid 值转换成一个字符串并返回它。

11.

选择 Build | Build NetFxWrapper 菜单命令。该操作将编译该组件,然后将其注册为 COM 对象。

既然已经创建了包装,就可以在 Visual Basic 6 中调用它了。

演练 3. 在 Visual Basic 6 中使用该包装

1.

启动 Microsoft Visual Basic 6.0

2.

New Project 对话框中,选择 Standard Exe,然后单击 Open

3.

选择 Project | References 菜单命令。

4.

添加一个对 NetFxWrapper 的引用。

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 5. 添加一个对在 Visual Basic .NET 中创建的 COM 对象的引用

5.

向该窗体添加一个 CommandButtonTextBox

6.

CommandButtonCaption 属性设置为 Generate

7.

对于 CommandButton 的单击事件,输入:

清单 4. 在 Visual Basic 6 中调用该包装

Private Sub Command1_Click()
Dim gw As NetFxWrapper.GuidWrapper
Set gw = New NetFxWrapper.GuidWrapper

Text1.Text = gw.NewGuid
End Sub

8.

运行此应用程序。您每次单击按钮时,Visual Basic 6 应用程序都将调入 Visual Basic .NET 包装并生成一个新的 GUID。GUID 将显示在 TextBox 中。

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 6. 显示 GUID

创建包装的规则

因为 Guid 类不遵循 COM 互操作性规则,因此需要包装类。包装类必须遵循的规则包括:

1.

包装必须公开默认的构造函数

在 Visual Basic 6 中,必须先创建一个对象实例,然后再用属性和方法初始化该对象。例如:

清单 5. 在 Visual Basic 6 中初始化一个连接对象

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;" & _
"User Id=admin;Password=;"

要设置一个连接对象,必须先创建它的一个实例,然后设置属性(如 ConnectionString)。在 Visual Basic 6 中,创建一个对象并初始化其属性必须作为不同的步骤进行。

然而,在 Visual Basic .NET 中,您可以在创建对象实例的同时指定初始化信息。Visual Basic .NET 中对应的代码是:

清单 6. 在 Visual Basic .NET 中将参数传递给构造函数

Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=mydb.mdb;User Id=admin;Password=;")

您可以看到,该对象是在一行代码中创建和初始化的。这是可能的,因为 .NET 类型有一个在创建对象时调用的 Sub New,而且该 Sub New 可以带参数。一个类甚至可以有多个 Sub New 构造函数方法,每个方法带有不同类型或不同数量的参数。

清单 7. Visual Basic .NET 类构造函数

Public Sub New()
End Sub
Public Sub New(ByVal connectionString As String)
End Sub

当您创建一个类实例时,Visual Basic .NET 编译器自动判断要调用哪个 Sub New。如果您创建了一个没有任何参数的 OleDbConnection 实例,它会调用不带任何参数的 Sub New。如果您创建了一个带有连接字符串参数的 OleDbConnection 实例,编译器会自动生成一个将一个字符串作为参数的 Sub New 调用。

不带任何参数的 Sub New 被称作“默认构造函数”,意味着这是在不提供任何参数的情况下默认调用的一个构造函数。

由于 Visual Basic 6 不能在您创建对象实例时传递参数,因此 .NET 类必须提供一个默认的构造函数,否则无法在 Visual Basic 6 中直接使用它。许多 .NET Framework 类不能直接使用的一个原因是,它们的 Sub New 方法都需要参数。它们不公开默认的构造函数,因此您无法在 Visual Basic 6 中创建它们的实例。

可以为这些对象创建包装类。您的包装公开一个默认的构造函数,但是当您的包装创建一个实际 .NET Framework 类的实例时,它将所需的参数传递给该类的 Sub New。

如需具体示例,请考虑 .NET Framework FileInfo 类。该类会让您了解磁盘文件的许多特征。不过,它不包含默认构造函数。FileInfo 的 Sub New 需要到所需文件的路径,但它可以按如下方式进行包装:

清单 8. FileInfo 的 Visual Basic .NET 包装

Private fi As FileInfo
Public Sub New()
End Sub
Public Sub Initialize(ByVal filePath As String)
fi = New FileInfo(filePath)
End Sub

该包装包含一个不接受任何参数的 Sub New。这将允许为 COM Interop 注册该类,以便 Visual Basic 6 应用程序可以创建该类的实例。只有在 Visual Basic 6 应用程序调用 Initialize 方法后才会创建内部的 FileInfo。这可以在 Visual Basic 6 中使用,如下所示:

清单 9. 在 Visual Basic 6 中使用 FileInfo 包装

Dim fi As NetFxWrapper.FileInfoWrapper
Set fi = New NetFxWrapper.FileInfoWrapper
fi.Initialize ("c:/somefile.txt")

2.

许多数据类型必须在 Visual Basic 6 和 Visual Basic .NET 之间转换

创建包装时的大多数工作归根结底就是将 Visual Basic .NET 数据类型转换成 Visual Basic 6 可以使用的类型。考虑以下两种方法;一种方法返回字符串,另一种方法返回 Guid 数据类型:

清单 10. Visual Basic .NET 中的包装函数

    Public Function NewGuidAsString() As String
Dim g As Guid = Guid.NewGuid()
Return g.ToString()
End Function
Public Function NewGuidAsGuid () As Guid
Dim g As Guid = Guid.NewGuid()
Return g
End Function

在 Visual Basic 6 中,调用 NewGuidAsString 也能正常运行,因为在 Visual Basic 6 和 Visual Basic .NET 之间传递字符串很容易。然而,在 Visual Basic 6 中调用 NewGuidAsGuid 会产生以下错误:

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 7. 在 Visual Basic 6 中调用 NewGuidAsGuid 而产生的错误

这是因为不能将 Guid 类型的对象从 Visual Basic .NET 直接传递到 Visual Basic 6。当您为 .NET 类创建包装时,大部分时间都用来将 .NET 数据类型转换成在 Visual Basic 6 中可以使用的类型。

您还可以使用 .NET MarshalAs 属性指定哪个 Visual Basic 6 类型应该用于参数和返回值。例如,如果 Visual Basic .NET 函数返回 Decimal 数据类型,则不能在 Visual Basic 6 中调用该函数。不过,您可以指定返回值应转换成 Currency 类型。这将允许 Visual Basic 6 正确使用该函数。

清单 11. 使用 MarshalAs 在 Visual Basic 6 和 Visual Basic .NET 类型之间转换:

Public Function ReturnDecimal() As _
_
Decimal
Return 1.1
End Function

下表列出 Visual Basic .NET 和 Visual Basic 6 类型之间进行的自动转换:

表 1. 从 Visual Basic .NET 到 Visual Basic 6 的类型转换
Visual Basic .NET 类型 Visual Basic 6 类型

Boolean

Boolean

Byte

Byte

Char

不支持,作为字符串返回给 Visual Basic 6。

DateTime

Date

Decimal

不支持,作为 Single、Double 返回,或者使用 MarshalAs 属性作为 Visual Basic 6 Currency 返回。

Double

Double

Guid

不支持,作为字符串返回给 Visual Basic 6。

Integer

Long

Long

不支持

Object

Object

SByte

在 Visual Basic 6 中不支持,作为 Integer 返回。

Short

Integer

Single

Single

String

String

TimeSpan

不支持,使用像 TotalSecondsTotalMinutes 之类的函数,作为 Double 返回。

3.

共享函数不能互操作

在 Visual Basic 6 中,您具有可以在代码中的任何位置调用的全局函数。全局函数的一个问题是,难以知道两个不同的全局函数是逻辑相关的。在 Visual Basic .NET 中,您可以将全局函数集中在一个类中。好处是,您可以通过使用该类的名称来调用函数,而不必创建该类的实际实例:

清单 12. 共享函数

If Not File.Exists(someFile) Then
MessageBox.Show("File not found")
End If

在本示例中,Exists 函数就是在 File 类外调用的。该代码尚未创建 File 类的实例来调用该方法;相反,Exists 是在 File 类型外调用的。这类函数被称作 Shared(或 Static)函数,它们在整个 .NET Framework 中使用。

Shared 函数的一个问题是,它们不与 Visual Basic 6 进行互操作。要让 Visual Basic 6 调用该函数,该函数必须真的是全局的,或者在一个类实例外调用。Shared 函数不属于这两种情况。

解决的办法是创建一个可以创建其实例的包装,然后使用该包装调用 Shared 函数。

清单 13. 调用共享函数的包装

Imports System.IO
_
Public Class FileWrapper
Public Const ClassId As String = "1596574F-9EE1-4439-854B-DF503099CEAE"
Public Const InterfaceId As String = "02F98DBC-9298-4E9D-A991-E618C1B1BC53"
Public Const EventsId As String = "2286FD23-B22D-4D49-B2CE-F3CFEC5C1CA5"
Public Sub New()
MyBase.New()
End Sub
Public Function Exists(ByVal fileName As String) As Boolean
Return File.Exists(fileName)
End Function
End Class

可以在 Visual Basic 6 中创建 FileWrapper 类,因为该类公开了一个默认的构造函数。调用 Exists 函数时,它调用共享的 File.Exists .NET 函数并返回结果。Visual Basic 6 正在调用 FileWrapper 的一个实例方法,FileWrapper 正在调用 .NET Framework File 类的一个共享方法。

在 Visual Basic 6 中,可以按以下方式使用:

清单 14. 在 Visual Basic 6 中使用 File.Exists

Private Sub Command5_Click()
Dim fw As New NetFxWrapper.FileWrapper
Label2 = fw.Exists("c:/platform.ini")
End Sub

4.

包装不应使用重载函数

.NET Framework 允许您拥有多个具有完全相同的名称、但参数不同的函数。考虑以下函数:

清单 15. Visual Basic .NET 中的重载函数

Public Sub Save(ByVal fileName As String)
_image.Save(fileName)
End Sub
Public Sub Save(ByVal fileName As String,
ByVal format As ImageFormatWrapper)
Dim imageFormat As Imaging.ImageFormat
Select Case format
Case ImageFormatWrapper.Bmp
imageFormat = Imaging.ImageFormat.Bmp
Case ImageFormatWrapper.Emf
imageFormat = Imaging.ImageFormat.Emf
Case ImageFormatWrapper.Exif
imageFormat = Imaging.ImageFormat.Exif
Case ImageFormatWrapper.Gif
imageFormat = Imaging.ImageFormat.Gif
Case ImageFormatWrapper.Icon
imageFormat = Imaging.ImageFormat.Icon
Case ImageFormatWrapper.MemoryBmp
imageFormat = Imaging.ImageFormat.MemoryBmp
Case ImageFormatWrapper.Png
imageFormat = Imaging.ImageFormat.Png
Case ImageFormatWrapper.Tiff
imageFormat = Imaging.ImageFormat.Tiff
Case ImageFormatWrapper.Wmf
imageFormat = Imaging.ImageFormat.Wmf
End Select
_image.Save(fileName, imageFormat)
End Sub

一个函数将文件名作为参数,另一个函数除此之外还带有一个图像格式参数。这两个函数均名为 Save。在 Visual Basic .NET 中调用这些函数时,编译器可以根据传递的参数确定要调用的函数。如果只传递一个参数,则调用第一个函数。如果传递两个参数,则调用第二个函数。

COM 不支持重载函数,因此,如果该类通过 COM interop 公开,COM 包装就必须为这些函数生成唯一的函数名。对于 Visual Basic 6,它们如下所示:

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 8. 在 Visual Basic 6 中调用重载函数

请注意,两个 Save 函数分别名为 SaveSave_2。这使您可以在 Visual Basic 6 中分辨出要调用的函数,但名称不是说明性的。最好不要在包装中使用重载,而是赋予每个函数唯一的名称:

清单 16. 函数的唯一名称

Public Sub Save(ByVal fileName As String)
_image.Save(fileName)
End Sub
Public Sub SaveWithImageFormat(ByVal fileName As String, _
ByVal format As ImageFormatWrapper)
Dim imageFormat As Imaging.ImageFormat
Select Case format
Case ImageFormatWrapper.Bmp
imageFormat = Imaging.ImageFormat.Bmp
Case ImageFormatWrapper.Emf
imageFormat = Imaging.ImageFormat.Emf
Case ImageFormatWrapper.Exif
imageFormat = Imaging.ImageFormat.Exif
Case ImageFormatWrapper.Gif
imageFormat = Imaging.ImageFormat.Gif
Case ImageFormatWrapper.Icon
imageFormat = Imaging.ImageFormat.Icon
Case ImageFormatWrapper.MemoryBmp
imageFormat = Imaging.ImageFormat.MemoryBmp
Case ImageFormatWrapper.Png
imageFormat = Imaging.ImageFormat.Png
Case ImageFormatWrapper.Tiff
imageFormat = Imaging.ImageFormat.Tiff
Case ImageFormatWrapper.Wmf
imageFormat = Imaging.ImageFormat.Wmf
End Select
_image.Save(fileName, imageFormat)
End Sub

现在,每个函数都有一个唯一的名称,更易于在 Visual Basic 6 中使用。

同时使用 Visual Basic 6 和 Visual Basic.NET 的最佳做法

图 9. 具有唯一名称的函数

5.

包装应该放在全局程序集缓存中

注册 COM 对象后,系统注册表包含 COM 对象 DLL 的文件路径。这样,当您的程序创建一个 COM 对象实例时,操作系统就可以找到该 DLL 并将它加载到内存中。

.NET 程序集的工作方式不同。.NET Framework 希望程序集与正在使用它的可执行程序位于相同的位置,或者希望程序集位于称作全局程序集缓存(Global Assembly Cache,GAC)的位置。要确保在运行时始终能找到您的 .NET 包装类,它们应该放在 GAC 中。

将一个程序集放在 GAC 中需要两个步骤。首先,该程序集必须经过签名。这可以通过以下步骤实现:

1.

Visual Basic Express 中返回到 NetFxWrapper 项目。

2.

Solution Explorer 中,双击 My Project。这将打开项目属性页。

3.

单击 Signing 选项卡。

4.

单击 Sign the Assembly 复选框。

5.

Choose a strong name key file 下拉框中,单击 。

6.

对于 Key file name,输入 MyKeyFile

7.

取消选中 Protect my key file with a password 复选框。

8.

单击 OK

9.

选择 Build | Build NetFxWrapper 菜单命令。

这会向该项目添加一个密钥文件,每次编译该项目时,都用该密钥对产生的 DLL 进行签名。程序集必须进行签名,然后才能放在全局程序集缓存中。

10.

导航到 Start | Run

11.

输入 cmd,然后单击 OK 打开命令窗口。

12.

在命令窗口中,更改包装类编译到的目录。在我的计算机上,该目录为: C:/Documents and Settings/Administrator/My Documents/Visual Studio 2005/Projects/NetFxWrapper/NetFxWrapper/bin/Release.

13.

输入 "C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/gacutil" -i NetFxWrapper.dll

特别需要注意 gacutil 的路径两侧的引号。您会收到一条消息:程序集已经成功添加到全局程序集缓存中了。

部署使用包装类的 Visual Basic 6 应用程序时,您的应用程序安装程序需要使用 gacutil 将包装类安装到 GAC 中。

比较各种方法

虽 然本文重点介绍使用 Visual Basic Fusion 方法时的最佳做法,但还是有必要花点儿时间来研究一下用于处理 Visual Basic 6 应用程序的各种方法,然后确定 Visual Basic Fusion 或者其他某种方法是否是特定 Visual Basic 6 应用程序的最佳选择。

这些方法包括维持 Visual Basic 6 应用程序现状、将整个应用程序迁移到 .NET,或使用 Visual Basic Fusion 技术。每种方法都只适用于特定情况。

维持现状

在该方法中,您决定保持用 Visual Basic 6 编写的应用程序仍然只是 Visual Basic 6 的,而根本不使用 .NET Framework。

优点:

简单:应用程序用 Visual Basic 6编写(或者迁移到 Visual Basic 6),因此维持应用程序的现状是最简单的选择。开发人员可能已经对该语言和开发环境有所了解,并且可以快速对应用程序进行更改或者错误修复。

缺点:

增加新功能: Visual Studio 6.0 是 1998 年发行的。从那时之后,除了一些 Service Pack 外,尚未对 Visual Basic 6 进行改进。然而,现在应用程序需要的功能已经变了。通常,应用程序应该具备以下功能:在出现新版本时可以自动更新,能够脱机工作、本地高速缓存数据、与 Internet 功能互操作、可与 Web 服务通信等。虽然当今的技术可以简化这些任务,但该技术在 Visual Basic 6 中不可用,因此,只使用 Visual Basic 6 进行这些种类的增强,其劳动强度非常大。最终结果是,许多 Visual Basic 6 应用程序不能增强为包括该类型的新功能,因为只使用 Visual Basic 6 成本太高、难度太大。

尽头:自 2002 年引入 Visual Basic .NET 以来,开发人员就从 Visual Basic 6 转移到 Visual Basic .NET。因此,大多数新的 Visual Basic 信息(书籍、文章、网络日记稿件、新闻组稿件等)都是有关 Visual Basic .NET 的。同时,有关 Visual Basic 6 的可用信息量在不断减少。此外,许多开发人员感觉到,由于该语言将继续得到更新和增强,因此转移到 Visual Basic .NET 将使其职业生涯的前景更加看好。这并不表示,在撰写本文时难以找到有关 Visual Basic 6 问题的在线技术帮助,或者难以招聘到 Visual Basic 6 开发人员,但随着时间的流逝,Visual Basic 6 会重走许多旧式语言的道路,无论是在可用信息方面,还是人才储备方面。

迁移到 Visual Basic .NET

该方法需要将 Visual Basic 6 应用程序完全迁移到 Visual Basic .NET。

优点:

使用技术:将 应用程序迁移到 Visual Basic .NET 是确保您能够快速并入新发明和新技术的最佳途径。Microsoft 以及其他公司将重点放在 .NET Framework 的功能上。这意味着许多新的 SDK 将支持 .NET 语言并且可能只对 .NET 语言起作用。像 Web 服务、应用程序自动更新,以及 Internet 功能(http 和 ftp 支持)这样的新技术本来就可用于 .NET 应用程序,但是不能始终反向移植到 Visual Basic 6。像 GotDotNetSourceForge 这样的站点包含上千个可重新发布的组件以及源代码,可以直接在 .NET 应用程序中使用。

开发人员工作效率:此外,新版本的 Visual Studio 比 Visual Studio 6.0 更有效,只能与 .NET 应用程序一起使用。

缺点:

风险:将整个一个应用程序从 Visual Basic 6 迁移到 Visual Basic .NET 不是件小事。如果该应用程序很重要,并且开发人员没有 Visual Basic .NET 的经验,则存在迁移失败的风险。

时间:迁移一个应用程序,并使其在 .NET 中达到在 Visual Basic 6 所实现的功能,这需要花费一定的时间。虽然这可以将应用程序摆在一个更好的位置以便于将来改进,但不能忽略迁移所需的时间和成本。

Visual Basic Fusion

Visual Basic Fusion 是在 Visual Basic 6 应用程序中使用 .NET 功能的行为。

优点:

使用技术:通过编写少量 Visual Basic .NET 代码,您可以访问完整的 .NET Framework 类库,调用 Web 服务,或者在 Visual Basic 6 应用程序中使用第 3 方或开放的源 .NET 库。

低风险:大 多数应用程序代码仍然为 Visual Basic 6,并且继续按现状工作。您编写的 Visual Basic .NET 代码的数量相对较少。这意味着您没有迁移失败的风险,因为您不会迁移整个应用程序。而且,没有 Visual Basic .NET 使用经验的开发人员只需粗略地学习一下 .NET Framework 就能使用所需功能。

高 ROI:与迁移整个应用程序相比,该方法的投入非常低,因此投资回报非常高,尤其是在短期内。

缺点:

Visual Basic 6:由于大多数应用程序仍然使用 Visual Basic 6,因此您在处理应用程序时需要继续使用 Visual Basic 6 IDE 和 Visual Basic 6 语言。该语言和 IDE 不像 Visual Basic .NET 那么有效。

调试:要有效地调试一个使用 Visual Basic 6 和 Visual Basic .NET 代码的应用程序,您需要同时打开这两个开发环境,在 Visual Basic 6 和 Visual Basic .NET 之间进行有效调试还需要专门的知识。

包装开发:要在 Visual Basic 6 中使用 .NET 功能,您需要编写 .NET 类的包装,以便它们可以公开为可以在 Visual Basic 6 中使用的 COM 对象。如果整个应用程序都迁移到 Visual Basic .NET,就不需要这些包装了。

使用简单代码

本文包括说明了所有讨论主题的示例代码。示例代码将解压缩到名为“Best Practices Code”的文件夹中。在该文件夹中,您将找到以下内容:

1.

Install.bat — 用于注册和安装 .NET 包装,以便在 Visual Basic 6 中使用它们。

2.

NetFxWrapper — 包含 Visual Basic .NET 包装类的源代码的文件夹。

3.

Best Practices Visual Basic 6 — 包含使用包装类的 Visual Basic6 示例的文件夹。

4.

ComClass.zip — 包含 ComClass 项目项。如果该文件位于 C:/Documents and Settings/[User Name]/My Documents/Visual Studio 2005/Templates/ItemTemplates 文件夹中,则该项目模板对您的 Visual Basic Express 项目可用。

如果尚未安装 Visual Studio 2005 或 Visual Basic Express,您只需双击 install.bat 就能注册包装类。然后,您可以打开 Visual Basic 6 项目,运行它,并研究代码以了解他是如何使用包装的。

如果您有 Visual Studio 2005 或 Visual Basic Express,您还可以打开包装类的源代码,研究它们的构造。

小结

Visual Basic Fusion 对于现有的 Visual Basic 6 应用程序是有用的方法,这些应用程序必须持续增强。Visual Basic Fusion 允许您无需更改现有的应用程序,即可在其中使用 .NET Framework 的任何功能要使用 Visual Basic Fusion 方法,您必须创建 Visual Basic .NET 包装类才能使用 .NET Framework 功能。这些包装类对于编写而言通常是微不足道的,但必须遵循某些规则,这样它们才能将自己作为 COM 对象正确地公开。本文为您介绍了创建包装类的最佳做法,并且提供了确定是否将 Visual Basic Fusion 或其他方法用于现有 Visual Basic6 应用程序的准则。

关于作者

Scott Swigart (www.swigartconsulting.com) 经常会花费一些时间与公司切磋如何充分利用当今的技术,同时为将来做好技术准备。与此同时,Scott 还以向 Visual Basic Fusion 站点投稿而引以为荣,因为该站点提供的实用信息和策略有助于 Visual Basic 开发人员以最少的努力获得最大的收益。Scott 还是一位 Microsoft MVP,并且是许多书籍和文章的合著者。如果您对本文有疑问或意见,请发送电子邮件至 scott@swigartconsulting.com

转到原英文页面