总览: Visual Basic.NET升级工具的信息的介绍以及将Visual Basic 6结构平滑升级到Visual Basic.NET 的指导 Basic.NET下打开的Visual Basic 6.0程序做一些改动。这篇文章的用途就是时你对原来的程序的改动尽可能的 少以及有效。 注:Visual Basic.NET仍然处于开发中,所以下面的一些细节可能还会有改动,下面的指导不保证在最终的产品出 来后代码不需要改动。 什么是Visual Basic.NET? 微软重新设计了产品以便使开发者能够更加容易的开发分布式应用,例如基于WEB的程序以及多层系统。 言,移走了原来的关键字,提高Type数据的安全性以及提供低级别结构以满足高级别开发者的需求。 的Web站点;通过继承,该语言实现了真正的支持面向对象编程(object-oriented programming);Windows窗体 本身支持可视继承;现在展开程序就象拷贝可执行文件和控件到另一个目录那样简单。 开发组件,而且通过交叉语言继承,你可以从用一种语言编写的类中派生用另一种语言编写的类。 为什么Visual Basic.NET不提供100%的继承性? 承以及线程),为了提供对新平台的完全访问,以及为了使Visual Basic能够完全转移到下一代的Web应用中。正 确的选择是完全新建。 牲新的Windows窗体的很多内在特性,例如安全以及可视继承性。 或者Visual C++。以及让Visual Basic开发者可以完全而且简单利用.NET框架的功能,而不需要象原来那样使用 Windows API调用。所有的Visual语言将与其它面向通用运行时语言(Common Language Runtime)的语言使用相同 的数据定义类型、数组、用户自定义数组、类以及界面。不过这样就要做一些牺牲,例如固定长度字符串以及以非 0数为下界的数组将不再被支持。 已经从新语言中移走了。 也是开发下一代的Web站点的最佳工具。 升级到Visual Basic.NET 需要升级以适应Visual Basic.NET 的基于Visual Basic.NET的工程。这个升级是单向的,既新的Visual Basic.NET工程无法再在Visual Basic 6.0中 打开。 常情况下,你还需要手工做一些修改,因为自动升级工具不可能替你做所有的事情。 同时在代码中添加注释提示你需要做的改动,这些注释会以“TO DO”列表形式列出在任务列表窗口中,所以你可 以很容易的需要改变的部分,要想浏览相关的代码只需要双击任务列表中的相关项就可以了。每一个任务以及升级 报告中的列表项都有相关的在线帮助标题以给你更多的帮助。 让Visual Basic 6.0和Visual Basic.NET同时工作 级道Visual Basic 6.0工程,编译、保存后再升级到Visual Basic.NET。 它语言编写的COM组件也可以集成到Visual Basic.NET中。例如你可以拖-放一个Visual Basic 6.0编写的ActiveX 控件到Visual Basic.NET的Windows窗体中,在Visual Basic.NET的类中使用Visual Basic 6.0的COM组件。 垃圾收集方式释放的,所以在对象被删除到对象真正被从内存中释放之间或许会有一定的延迟。 个组件变的比以往更加容易,配置一个组件文件只需要简单的拷贝文件到目录就可以了(不需要regsvr32)。将组 件升级到新版本之需要以新文件覆盖就文件就可以了。你所要做的只是确定新组件的类同方法同旧组件兼容。 结构介绍 问、基于HTTP的消息传递文件配置。要获得以上特性,你需要使用Visual Basic.NET。 基于浏览器的应用 Visual Basic 6.0和Visual Studio 6提供了以下的技术用于建立基于浏览器的Internet和Intranet应用: Webclasses DHTML projects ActiveX documents Active Server Pages (ASP) 窗体是.NET架构中非常重要的一个组成部分。一个Web窗体包含两个部分:HTML文件和源程序文件。HTML文件用于 描述页面;源程序文件用于响应、控制页面事件。建立一个Web窗体同现在建立一个VisualBasic窗体一样简单。 它的WYSIWYG 界面设计方式同现在的Visual Basic是一样的。下面的图片演示了一个Web窗体的设计: 序是编译执行的,同解释执行的ASP比较起来速度要快很多。 面的建议。 C++ 6.0开发的COM组件,Visual Basic.NET完全支持ASP,你可以同时使用ASP、ASP.NET、Web窗体来扩展你的应用。 同时Visual Basic 6.0或者VC6商用组件可以不经升级获修改直接在Visual Basic.NET中使用。 6.0下开发这些应用。同DHTML工程一样,ActiveX Documents不被Visual Basic.NET支持。不能自动升级。我们建 议:或者在Visual Basic 6.0下开发ActiveX Documents或者将ActiveX Documents转换为用户自定义控件。不过 ActiveX documents 和 DHTML应用程序可以集成到Visual Basic.NET技术中。 你还需要做一些更改。现存的Web类应用可以集成到Visual Basic.NET的Web窗体和ASP应用中,但是在新工程中, 我们建议在新工程中使用ASP的Windows DNA平台。关于更多的关于Windows DNA的信息,请访问微软DNA站点: http://msdn.microsoft.com/isapi/gomscom.as...sp?Target=/dna/ 客户/服务器工程 Visual Basic 6.0提供以下技术用于建立客户端/服务器应用: Visual Basic窗体 Microsoft Transaction Server (MTS)/COM+中间层对象 用户控件 的对象模块,不过绝大部分是兼容的。当你的工程升级时,Visual Basic窗体自动升级到Windows窗体。下面是 Windows窗体的示例: 你可以从 客户端到MTS/COM+组件再到客户端进行步进调试。同时集成调试器也支持在MTS 和 COM+ 组件内部进行 调试(组件需要以native code方式编译,包含符号调试信息以及不进行优化)。 其结构如下图所示: 及平台访问它们的功能。尽管不再支持MTS事务,但是你还是有理由将你的应用升级到Web Server,如果你不仅需 要分布式事务处理而且需要跨平台操作。通过Visual Basic.NET你可以通过简单的拖-放操作来完成。 单层应用 Visual Basic 6.0支持建立以下类型的单层应用程序: 单层数据库应用程序 Visual Basic插件 普通的应用程序以及游戏。 Basic.NET 包含新的中性语言(language-neutral)的扩展模块Visual Basic.NET的插件现在就等同于Visual Studio.NET add-ins,你可以利用Visual Studio.NET中的任何语言来开发插件。例如,你可以编写一个Visual Basic.NET插件 来绘制Visual C#窗体的颜色或者为VB类添加注释。为了支持这些新的功能,Visual Basic.NET已经不再支持旧的 扩展模块,你需要更改原来程序中的扩展对象。 也提供了新特性。例如意外句柄可以捕捉文件系统错误,使用注册表类可以勇于操控注册表。需要注意的是,一些 依赖于系统性能特征(performance characteristics)的程序,例如游戏需要做改进,因为Visual Basic.NET提 供了新的系统性能特征,对于Visual Basic.NET下的游戏开发,你可以使用微软DirectX7,或者使用新的GDI:GDI+, GDI+包含了很多新特性,对简单的2-D游戏提供了Alpha混合、反锯齿支持以及更多的图像文件格式的支持。 数据库操作 Visual Basic 6.0提供了以下类型的数据库访问方式: ActiveX Data Objects (ADO) Remote Data Objects (RDO) Data Access Objects (DAO) 应用提供了更强大的支持。ADO.NET提供了绑定数据库到Windows窗体控件和Web窗体。 和RDO数据库到控件、数据库控件或者RDO用户连接的绑定。我们建议在应用中包含DAO和RDO的应用或者仍然使用 Visual Basic 6.0开发或者再升级到Visual Basic.NET前将它们更改为ADO数据绑定。 语言方面的改进 被人诟病的是它不真正支持面向对象编程(oop)。 在新的Visual Basic中,这些都将成为过去。Visual Basic.NET将真正支持oop。继承(inheritance)、多态 (polymorphism)以及重载(overloading)。当然还不止这些。包括一些新的数据结构、结构性的错误控制(Error Handing)以及线程。这些都将被新的VB所支持。 继承 你可以这样编写新类: 重载 户的ID号码。那么该函数可能有以下两种类型: Function GetCustomerID(custname as string) As Integer ' 通过用户名获得用户ID End Function Function GetCustomerID(purch as long) As Integer ' 根据购物单号码获得用户ID End Function 通过重载,你就可以根据不同类型的输入调用同一个函数。 实际上现在的VB在某种程度上提供了重载的功能,考虑下面的函数: Function GetCustomID(vIN As Variant) As Long End Function 你可以以下面两种方式调用 ID = GetCustomID("123") 或者 ID = GetCustomID(123) type safety)。在Visual Basic.NET中,Variant类型将不复存在,详细的介绍看下面关于升级部分的内容。 多态 编写GetCustomerName函数,在新版的VB中,你就可以这样写: Inherits BaseClass Function GetOrders() Overrides Function GetOrders() ... End Function 线程 set t = New Thread(New Threadstart 例如回调函数方面将是很有帮助的。 错误处理(Error Handling) Delphi中的那样(微软的原文是:just like those "respectable" languages :-))。例如: Sub SafeWrite() Try Catch Finally End Try End Sub 升级 Variant类型到Object类型 型和Empty,Error,Nothing和Null。在Visual Basic.NET中,Object数据类型可以设定为任何原始数据类型和Empty, Error,Nothing,Null和对象指针。当你的工程升级到Visual Basic.NET后,任何Variant定义都会改变为Object。 同样,当你在编辑器中插入代码时,Variant关键字也会被替换为Object。 Integer数据类型到Short数据类型 数据定义会做如下改动: Dim x As Integer dim y as Long 更改为: Dim x As Short dim y as Integer 属性语法 Property Get MyProperty() As Integer End Property Property Let MyProperty(NewValue As Integer) End Property 升级后更改为: Property MyProperty() As Short End Property VB窗体到Windows窗体 Windows窗体。 界面 在先前的版本中,公用类界面对于用户总是隐藏的。在Visual Basic.NET中,公用类可以在代码窗口中浏览和编辑。 升级报告及注释 会加入注释提示你注意任何潜在的问题。这些注释自动出现在Visual Basic.NET的任务列表中。 编程介绍 使用先前绑定 然后在运行时将其设定为一个类。然而,在升级过程中,当访问延迟绑定对象的缺省属性时可能会产生错误。例 如假设工程中包含Form1,Form1中有一个Label对象,名称为Label1,下面的Visual Basic 6.0代码将Label的标题 设定 为"SomeText" Dim o As Object Set o = Me.Label1 o.Caption = "SomeText" 实例中的Caption属性都会转换为Text属性,但是延迟绑定对象是无类型(type-less)的,VB无法检测到对象的 类型并做更改,在这种情况下,你需要手工对代码做改动。当你使用先前绑定对象时,对象可以自动升级,如下: Dim o As Label Set o = Me.Label1 o.Caption = "SomeText" 本会被调用;如果传递一个字符串,String版本会被调用。如果传递Object或者Variant数据类型到一个重载函数 将产生运行时错误。如果要想产生正确的结果就需要通过数据类型的强制转换,例如: Dim a As String Dim v As Variant v = "Path" a = Environ(CStr(v)) 松的移植到Visual Basic.NET使用Date存储日期/时间较早版本的VB支持使用Double数据类型来存储和改变时间。 在Visual Basic.NET中,这个特性将不再支持,因为在计算机内部日期并不是以Double方式存储的,例如下面的代 码可以在Visual Basic 6.0中运行,但是在Visual Basic.NET中会产生错误。 Dim dbl As Double Dim dat As Date dat = Now dbl = dat dbl = DateAdd("d", 1, dbl) dat = CDate(dbl) 工修改,所以在存储日期时应该使用Date数据类型。 缺省属性 MsgBox Form1.Text1.Text 可以这样编写: MsgBox Form1.Text1 缺省属性在代码编译是决定。同样,你也可以在延迟绑定的对象中使用缺省属性,例如: Dim obj As Object Set obj = Form1.Text1 MsgBox obj 对于延迟绑定的对象,缺省属性在程序运行时决定。 迟绑定的对象无法自动解决决定缺省属性的问题。在这种情况下,你需要自己来修改代码。更加复杂的是,很多库 是通过 _Default属性来实现缺省属性的。_Default象是一个代理,它将调用传递给真正的缺省属性。所以当你的 工程升级后,一些属性会被更改为 _Default。代码还是象往常那样工作,只是代码不如原来的实际属性易读。 Dim obj As Object Set obj = Me.Text1 MsgBox obj MsgBox Me.Text1 use: Dim obj As Object Set obj = Me.Text1 MsgBox obj.Text MsgBox Me.Text1.Text 是范例: Dim rs As ADODB.Recordset rs("CompanyName") = "SomeCompany" rs!CompanyName = "SomeCompany" 实际上等于: Dim rs As ADODB.Recordset rs.Fields("CompanyName").Value = "SomeCompany" rs.Fields!CompanyName.Value = "SomeCompany" 因为Value是Fields的缺省属性 对于第二种写法,Visual Basic.NET是支持的;然而第一种情况不被支持,那么正确的用法如下: Dim rs As ADODB.Recordset rs("CompanyName").Value = "SomeCompany" rs!CompanyName.Value = "SomeCompany" 和Variant数据类型使用缺省属性。因为升级程序无法发现并解决这些错误。 对Boolean类型数据使用AND/OR/NOT操作 既执行逻辑AND操作也执行逐位AND操作,取决于操作数(如果是Boolean类型,执行逻辑AND操作,如果是数字,执 行逐位AND操作)。在Visual Basic.NET中,AND运算只执行逻辑AND操作。对于逐位操作,在Visual Basic.NET提供 了一组操作:BitAnd, BitOr, BitNot以及BitXor 。 下面是演示这些差异的范例程序 Dim a As Integer Dim b As Integer Dim c As Boolean a = 1 b = 2 c = a And b MsgBox ("The answer is " & c) 结果是True(执行逻辑AND操作)。 VB6.Not,这些函数执行的结果同Visual Basic 6.0下的AND/OR/NOT操作的执行结果是一样的。当代码升级后,结 果会象下面这样: Dim a As Short Dim b As Short Dim c As Boolean a = 1 b = 2 c = VB6.And(a, b) MsgBox ("The answer is " & c) 升级后的代码会得出False的结果,同Visual Basic 6.0下运行一样 如,如果上面的代码更改为下面的方式: Dim a As Integer Dim b As Integer Dim c As Boolean a = 1 b = 2 c = a <> 0 And b <> 0 MsgBox ("The answer is " & c) 当升级后,代码同原来的几乎一样: Dim a As Short Dim b As Short Dim c As Boolean a = 1 b = 2 c = a <> 0 And b <> 0 MsgBox ("The answer is " & c) AND操作。所以在升级到Visual Basic.NET后不会发生改变。这样做的意义是你可以直接在Visual Basic.NET和 Visual Basic 6.0之间拷贝和粘贴代码,你的代码会运行的更快因为使用的是本地的AND操作而不是兼容函数。 Dim b As Boolean b = Function1() And Function2() 中,只有当Function1的结果为True时才会计算Function2。因为Visual Basic.NET中的AND运算执行的是逻辑AND操 作,如果Function1结果为False,AND结果肯定是False,为了加快速度就不再执行Function2的了。但是如果 Function2另有目的,例如用于避免某些错误,那么就会出现不可预知的错误,那么上面的代码升级后就会象下面 的样子: Dim b As Boolean b = VB6.AND(Function1(), Function2()) 为了不在升级代码中出现兼容函数,原来的代码需要做如下的改动: Dim b As Boolean Dim c As Boolean Dim d As Boolean c = Function1() d = Function2() b = c And d 能集成在 .NET语言中。因为有这个改变,你需要再你的Visual Basic 6.0工程中使用常量True而不是-1来表示真 值,使用Boolean类型而不是整数类型变量保存Boolean数据。下面的代码说明了Visual Basic 6.0和Visual Basic.NET 之间的不同: Dim i As Integer i = True If i = -1 Then Else End If 在Visual Basic 6.0中,结果为True,而在Visual Basic.NET中结果为False。 如果对代码做如下改动,程序在两种语言下运行都会显示True Dim i As Boolean i = True If i = True Then Else End If 通过上面的范例可以看出在程序中需要注意两点: 1、使用常量True和False来判断是否而不要使用0和-1 2、使用Boolean类型变量储存Boolean数值而不要使用Integer类型变量 如果在你的程序中没有这么做的话,在升级后你还需要做大量的手工改动 避免Null传播(Propagation) 的范例,结果V都将是Null Dim V V = 1 + Null V = Null + Right$("SomeText", 1) V = Right("SomeText", 0) Basic 6.0中有两个求左值的函数:Left和Left$前者返回值为Variant类型并且可以为空,Left$函数返回值为String 类型。在Visual Basic.NET中,只有一个Left函数,该函数总是返回String类型值 Basic.NET中,下面的函数将不再返回Null值: Chr Mid Command Oct CurDir Right Date RTrim Environ Space Error Str Hex Time LCase Trim LTrim UCase 由于数据库中的数据可以包含Null值,所以你需要在程序中对获得的数据加入代码检测其值是否为Null。 使用以0为下界的数组 |