總覽: Visual Basic.NET升級(jí)工具的信息的介紹以及將Visual Basic 6結(jié)構(gòu)平滑升級(jí)到Visual Basic.NET 的指導(dǎo) Basic.NET下打開的Visual Basic 6.0程序做一些改動(dòng)。這篇文章的用途就是時(shí)你對(duì)原來(lái)的程序的改動(dòng)盡可能的 少以及有效。 注:Visual Basic.NET仍然處于開發(fā)中,所以下面的一些細(xì)節(jié)可能還會(huì)有改動(dòng),下面的指導(dǎo)不保證在最終的產(chǎn)品出 來(lái)后代碼不需要改動(dòng)。 什么是Visual Basic.NET? 微軟重新設(shè)計(jì)了產(chǎn)品以便使開發(fā)者能夠更加容易的開發(fā)分布式應(yīng)用,例如基于WEB的程序以及多層系統(tǒng)。 言,移走了原來(lái)的關(guān)鍵字,提高Type數(shù)據(jù)的安全性以及提供低級(jí)別結(jié)構(gòu)以滿足高級(jí)別開發(fā)者的需求。 的Web站點(diǎn);通過(guò)繼承,該語(yǔ)言實(shí)現(xiàn)了真正的支持面向?qū)ο缶幊蹋╫bject-oriented programming);Windows窗體 本身支持可視繼承;現(xiàn)在展開程序就象拷貝可執(zhí)行文件和控件到另一個(gè)目錄那樣簡(jiǎn)單。 開發(fā)組件,而且通過(guò)交叉語(yǔ)言繼承,你可以從用一種語(yǔ)言編寫的類中派生用另一種語(yǔ)言編寫的類。 為什么Visual Basic.NET不提供100%的繼承性? 承以及線程),為了提供對(duì)新平臺(tái)的完全訪問(wèn),以及為了使Visual Basic能夠完全轉(zhuǎn)移到下一代的Web應(yīng)用中。正 確的選擇是完全新建。 牲新的Windows窗體的很多內(nèi)在特性,例如安全以及可視繼承性。 或者Visual C++。以及讓Visual Basic開發(fā)者可以完全而且簡(jiǎn)單利用.NET框架的功能,而不需要象原來(lái)那樣使用 Windows API調(diào)用。所有的Visual語(yǔ)言將與其它面向通用運(yùn)行時(shí)語(yǔ)言(Common Language Runtime)的語(yǔ)言使用相同 的數(shù)據(jù)定義類型、數(shù)組、用戶自定義數(shù)組、類以及界面。不過(guò)這樣就要做一些犧牲,例如固定長(zhǎng)度字符串以及以非 0數(shù)為下界的數(shù)組將不再被支持。 已經(jīng)從新語(yǔ)言中移走了。 也是開發(fā)下一代的Web站點(diǎn)的最佳工具。 升級(jí)到Visual Basic.NET 需要升級(jí)以適應(yīng)Visual Basic.NET 的基于Visual Basic.NET的工程。這個(gè)升級(jí)是單向的,既新的Visual Basic.NET工程無(wú)法再在Visual Basic 6.0中 打開。 常情況下,你還需要手工做一些修改,因?yàn)樽詣?dòng)升級(jí)工具不可能替你做所有的事情。 同時(shí)在代碼中添加注釋提示你需要做的改動(dòng),這些注釋會(huì)以“TO DO”列表形式列出在任務(wù)列表窗口中,所以你可 以很容易的需要改變的部分,要想瀏覽相關(guān)的代碼只需要雙擊任務(wù)列表中的相關(guān)項(xiàng)就可以了。每一個(gè)任務(wù)以及升級(jí) 報(bào)告中的列表項(xiàng)都有相關(guān)的在線幫助標(biāo)題以給你更多的幫助。 讓Visual Basic 6.0和Visual Basic.NET同時(shí)工作 級(jí)道Visual Basic 6.0工程,編譯、保存后再升級(jí)到Visual Basic.NET。 它語(yǔ)言編寫的COM組件也可以集成到Visual Basic.NET中。例如你可以拖-放一個(gè)Visual Basic 6.0編寫的ActiveX 控件到Visual Basic.NET的Windows窗體中,在Visual Basic.NET的類中使用Visual Basic 6.0的COM組件。 垃圾收集方式釋放的,所以在對(duì)象被刪除到對(duì)象真正被從內(nèi)存中釋放之間或許會(huì)有一定的延遲。 個(gè)組件變的比以往更加容易,配置一個(gè)組件文件只需要簡(jiǎn)單的拷貝文件到目錄就可以了(不需要regsvr32)。將組 件升級(jí)到新版本之需要以新文件覆蓋就文件就可以了。你所要做的只是確定新組件的類同方法同舊組件兼容。 結(jié)構(gòu)介紹 問(wèn)、基于HTTP的消息傳遞文件配置。要獲得以上特性,你需要使用Visual Basic.NET。 基于瀏覽器的應(yīng)用 Visual Basic 6.0和Visual Studio 6提供了以下的技術(shù)用于建立基于瀏覽器的Internet和Intranet應(yīng)用: Webclasses DHTML projects ActiveX documents Active Server Pages (ASP) 窗體是.NET架構(gòu)中非常重要的一個(gè)組成部分。一個(gè)Web窗體包含兩個(gè)部分:HTML文件和源程序文件。HTML文件用于 描述頁(yè)面;源程序文件用于響應(yīng)、控制頁(yè)面事件。建立一個(gè)Web窗體同現(xiàn)在建立一個(gè)VisualBasic窗體一樣簡(jiǎn)單。 它的WYSIWYG 界面設(shè)計(jì)方式同現(xiàn)在的Visual Basic是一樣的。下面的圖片演示了一個(gè)Web窗體的設(shè)計(jì): 序是編譯執(zhí)行的,同解釋執(zhí)行的ASP比較起來(lái)速度要快很多。 面的建議。 C++ 6.0開發(fā)的COM組件,Visual Basic.NET完全支持ASP,你可以同時(shí)使用ASP、ASP.NET、Web窗體來(lái)擴(kuò)展你的應(yīng)用。 同時(shí)Visual Basic 6.0或者VC6商用組件可以不經(jīng)升級(jí)獲修改直接在Visual Basic.NET中使用。 6.0下開發(fā)這些應(yīng)用。同DHTML工程一樣,ActiveX Documents不被Visual Basic.NET支持。不能自動(dòng)升級(jí)。我們建 議:或者在Visual Basic 6.0下開發(fā)ActiveX Documents或者將ActiveX Documents轉(zhuǎn)換為用戶自定義控件。不過(guò) ActiveX documents 和 DHTML應(yīng)用程序可以集成到Visual Basic.NET技術(shù)中。 你還需要做一些更改?,F(xiàn)存的Web類應(yīng)用可以集成到Visual Basic.NET的Web窗體和ASP應(yīng)用中,但是在新工程中, 我們建議在新工程中使用ASP的Windows DNA平臺(tái)。關(guān)于更多的關(guān)于Windows DNA的信息,請(qǐng)?jiān)L問(wèn)微軟DNA站點(diǎn): http://msdn.microsoft.com/isapi/gomscom.as...sp?Target=/dna/ 客戶/服務(wù)器工程 Visual Basic 6.0提供以下技術(shù)用于建立客戶端/服務(wù)器應(yīng)用: Visual Basic窗體 Microsoft Transaction Server (MTS)/COM+中間層對(duì)象 用戶控件 的對(duì)象模塊,不過(guò)絕大部分是兼容的。當(dāng)你的工程升級(jí)時(shí),Visual Basic窗體自動(dòng)升級(jí)到Windows窗體。下面是 Windows窗體的示例: 你可以從 客戶端到MTS/COM+組件再到客戶端進(jìn)行步進(jìn)調(diào)試。同時(shí)集成調(diào)試器也支持在MTS 和 COM+ 組件內(nèi)部進(jìn)行 調(diào)試(組件需要以native code方式編譯,包含符號(hào)調(diào)試信息以及不進(jìn)行優(yōu)化)。 其結(jié)構(gòu)如下圖所示: 及平臺(tái)訪問(wèn)它們的功能。盡管不再支持MTS事務(wù),但是你還是有理由將你的應(yīng)用升級(jí)到Web Server,如果你不僅需 要分布式事務(wù)處理而且需要跨平臺(tái)操作。通過(guò)Visual Basic.NET你可以通過(guò)簡(jiǎn)單的拖-放操作來(lái)完成。 單層應(yīng)用 Visual Basic 6.0支持建立以下類型的單層應(yīng)用程序: 單層數(shù)據(jù)庫(kù)應(yīng)用程序 Visual Basic插件 普通的應(yīng)用程序以及游戲。 Basic.NET 包含新的中性語(yǔ)言(language-neutral)的擴(kuò)展模塊Visual Basic.NET的插件現(xiàn)在就等同于Visual Studio.NET add-ins,你可以利用Visual Studio.NET中的任何語(yǔ)言來(lái)開發(fā)插件。例如,你可以編寫一個(gè)Visual Basic.NET插件 來(lái)繪制Visual C#窗體的顏色或者為VB類添加注釋。為了支持這些新的功能,Visual Basic.NET已經(jīng)不再支持舊的 擴(kuò)展模塊,你需要更改原來(lái)程序中的擴(kuò)展對(duì)象。 也提供了新特性。例如意外句柄可以捕捉文件系統(tǒng)錯(cuò)誤,使用注冊(cè)表類可以勇于操控注冊(cè)表。需要注意的是,一些 依賴于系統(tǒng)性能特征(performance characteristics)的程序,例如游戲需要做改進(jìn),因?yàn)閂isual Basic.NET提 供了新的系統(tǒng)性能特征,對(duì)于Visual Basic.NET下的游戲開發(fā),你可以使用微軟DirectX7,或者使用新的GDI:GDI+, GDI+包含了很多新特性,對(duì)簡(jiǎn)單的2-D游戲提供了Alpha混合、反鋸齒支持以及更多的圖像文件格式的支持。 數(shù)據(jù)庫(kù)操作 Visual Basic 6.0提供了以下類型的數(shù)據(jù)庫(kù)訪問(wèn)方式: ActiveX Data Objects (ADO) Remote Data Objects (RDO) Data Access Objects (DAO) 應(yīng)用提供了更強(qiáng)大的支持。ADO.NET提供了綁定數(shù)據(jù)庫(kù)到Windows窗體控件和Web窗體。 和RDO數(shù)據(jù)庫(kù)到控件、數(shù)據(jù)庫(kù)控件或者RDO用戶連接的綁定。我們建議在應(yīng)用中包含DAO和RDO的應(yīng)用或者仍然使用 Visual Basic 6.0開發(fā)或者再升級(jí)到Visual Basic.NET前將它們更改為ADO數(shù)據(jù)綁定。 語(yǔ)言方面的改進(jìn) 被人詬病的是它不真正支持面向?qū)ο缶幊?oop)。 在新的Visual Basic中,這些都將成為過(guò)去。Visual Basic.NET將真正支持oop。繼承(inheritance)、多態(tài) (polymorphism)以及重載(overloading)。當(dāng)然還不止這些。包括一些新的數(shù)據(jù)結(jié)構(gòu)、結(jié)構(gòu)性的錯(cuò)誤控制(Error Handing)以及線程。這些都將被新的VB所支持。 繼承 你可以這樣編寫新類: 重載 戶的ID號(hào)碼。那么該函數(shù)可能有以下兩種類型: Function GetCustomerID(custname as string) As Integer ' 通過(guò)用戶名獲得用戶ID End Function Function GetCustomerID(purch as long) As Integer ' 根據(jù)購(gòu)物單號(hào)碼獲得用戶ID End Function 通過(guò)重載,你就可以根據(jù)不同類型的輸入調(diào)用同一個(gè)函數(shù)。 實(shí)際上現(xiàn)在的VB在某種程度上提供了重載的功能,考慮下面的函數(shù): Function GetCustomID(vIN As Variant) As Long End Function 你可以以下面兩種方式調(diào)用 ID = GetCustomID("123") 或者 ID = GetCustomID(123) type safety)。在Visual Basic.NET中,Variant類型將不復(fù)存在,詳細(xì)的介紹看下面關(guān)于升級(jí)部分的內(nèi)容。 多態(tài) 編寫GetCustomerName函數(shù),在新版的VB中,你就可以這樣寫: Inherits BaseClass Function GetOrders() Overrides Function GetOrders() ... End Function 線程 set t = New Thread(New Threadstart 例如回調(diào)函數(shù)方面將是很有幫助的。 錯(cuò)誤處理(Error Handling) Delphi中的那樣(微軟的原文是:just like those "respectable" languages :-))。例如: Sub SafeWrite() Try Catch Finally End Try End Sub 升級(jí) Variant類型到Object類型 型和Empty,Error,Nothing和Null。在Visual Basic.NET中,Object數(shù)據(jù)類型可以設(shè)定為任何原始數(shù)據(jù)類型和Empty, Error,Nothing,Null和對(duì)象指針。當(dāng)你的工程升級(jí)到Visual Basic.NET后,任何Variant定義都會(huì)改變?yōu)镺bject。 同樣,當(dāng)你在編輯器中插入代碼時(shí),Variant關(guān)鍵字也會(huì)被替換為Object。 Integer數(shù)據(jù)類型到Short數(shù)據(jù)類型 數(shù)據(jù)定義會(huì)做如下改動(dòng): Dim x As Integer dim y as Long 更改為: Dim x As Short dim y as Integer 屬性語(yǔ)法 Property Get MyProperty() As Integer End Property Property Let MyProperty(NewValue As Integer) End Property 升級(jí)后更改為: Property MyProperty() As Short End Property VB窗體到Windows窗體 Windows窗體。 界面 在先前的版本中,公用類界面對(duì)于用戶總是隱藏的。在Visual Basic.NET中,公用類可以在代碼窗口中瀏覽和編輯。 升級(jí)報(bào)告及注釋 會(huì)加入注釋提示你注意任何潛在的問(wèn)題。這些注釋自動(dòng)出現(xiàn)在Visual Basic.NET的任務(wù)列表中。 編程介紹 使用先前綁定 然后在運(yùn)行時(shí)將其設(shè)定為一個(gè)類。然而,在升級(jí)過(guò)程中,當(dāng)訪問(wèn)延遲綁定對(duì)象的缺省屬性時(shí)可能會(huì)產(chǎn)生錯(cuò)誤。例 如假設(shè)工程中包含F(xiàn)orm1,F(xiàn)orm1中有一個(gè)Label對(duì)象,名稱為L(zhǎng)abel1,下面的Visual Basic 6.0代碼將Label的標(biāo)題 設(shè)定 為"SomeText" Dim o As Object Set o = Me.Label1 o.Caption = "SomeText" 實(shí)例中的Caption屬性都會(huì)轉(zhuǎn)換為Text屬性,但是延遲綁定對(duì)象是無(wú)類型(type-less)的,VB無(wú)法檢測(cè)到對(duì)象的 類型并做更改,在這種情況下,你需要手工對(duì)代碼做改動(dòng)。當(dāng)你使用先前綁定對(duì)象時(shí),對(duì)象可以自動(dòng)升級(jí),如下: Dim o As Label Set o = Me.Label1 o.Caption = "SomeText" 本會(huì)被調(diào)用;如果傳遞一個(gè)字符串,String版本會(huì)被調(diào)用。如果傳遞Object或者Variant數(shù)據(jù)類型到一個(gè)重載函數(shù) 將產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。如果要想產(chǎn)生正確的結(jié)果就需要通過(guò)數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換,例如: Dim a As String Dim v As Variant v = "Path" a = Environ(CStr(v)) 松的移植到Visual Basic.NET使用Date存儲(chǔ)日期/時(shí)間較早版本的VB支持使用Double數(shù)據(jù)類型來(lái)存儲(chǔ)和改變時(shí)間。 在Visual Basic.NET中,這個(gè)特性將不再支持,因?yàn)樵谟?jì)算機(jī)內(nèi)部日期并不是以Double方式存儲(chǔ)的,例如下面的代 碼可以在Visual Basic 6.0中運(yùn)行,但是在Visual Basic.NET中會(huì)產(chǎn)生錯(cuò)誤。 Dim dbl As Double Dim dat As Date dat = Now dbl = dat dbl = DateAdd("d", 1, dbl) dat = CDate(dbl) 工修改,所以在存儲(chǔ)日期時(shí)應(yīng)該使用Date數(shù)據(jù)類型。 缺省屬性 MsgBox Form1.Text1.Text 可以這樣編寫: MsgBox Form1.Text1 缺省屬性在代碼編譯是決定。同樣,你也可以在延遲綁定的對(duì)象中使用缺省屬性,例如: Dim obj As Object Set obj = Form1.Text1 MsgBox obj 對(duì)于延遲綁定的對(duì)象,缺省屬性在程序運(yùn)行時(shí)決定。 遲綁定的對(duì)象無(wú)法自動(dòng)解決決定缺省屬性的問(wèn)題。在這種情況下,你需要自己來(lái)修改代碼。更加復(fù)雜的是,很多庫(kù) 是通過(guò) _Default屬性來(lái)實(shí)現(xiàn)缺省屬性的。_Default象是一個(gè)代理,它將調(diào)用傳遞給真正的缺省屬性。所以當(dāng)你的 工程升級(jí)后,一些屬性會(huì)被更改為 _Default。代碼還是象往常那樣工作,只是代碼不如原來(lái)的實(shí)際屬性易讀。 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" 實(shí)際上等于: Dim rs As ADODB.Recordset rs.Fields("CompanyName").Value = "SomeCompany" rs.Fields!CompanyName.Value = "SomeCompany" 因?yàn)閂alue是Fields的缺省屬性 對(duì)于第二種寫法,Visual Basic.NET是支持的;然而第一種情況不被支持,那么正確的用法如下: Dim rs As ADODB.Recordset rs("CompanyName").Value = "SomeCompany" rs!CompanyName.Value = "SomeCompany" 和Variant數(shù)據(jù)類型使用缺省屬性。因?yàn)樯?jí)程序無(wú)法發(fā)現(xiàn)并解決這些錯(cuò)誤。 對(duì)Boolean類型數(shù)據(jù)使用AND/OR/NOT操作 既執(zhí)行邏輯AND操作也執(zhí)行逐位AND操作,取決于操作數(shù)(如果是Boolean類型,執(zhí)行邏輯AND操作,如果是數(shù)字,執(zhí) 行逐位AND操作)。在Visual Basic.NET中,AND運(yùn)算只執(zhí)行邏輯AND操作。對(duì)于逐位操作,在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) 結(jié)果是True(執(zhí)行邏輯AND操作)。 VB6.Not,這些函數(shù)執(zhí)行的結(jié)果同Visual Basic 6.0下的AND/OR/NOT操作的執(zhí)行結(jié)果是一樣的。當(dāng)代碼升級(jí)后,結(jié) 果會(huì)象下面這樣: 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) 升級(jí)后的代碼會(huì)得出False的結(jié)果,同Visual Basic 6.0下運(yùn)行一樣 如,如果上面的代碼更改為下面的方式: 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) 當(dāng)升級(jí)后,代碼同原來(lái)的幾乎一樣: 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操作。所以在升級(jí)到Visual Basic.NET后不會(huì)發(fā)生改變。這樣做的意義是你可以直接在Visual Basic.NET和 Visual Basic 6.0之間拷貝和粘貼代碼,你的代碼會(huì)運(yùn)行的更快因?yàn)槭褂玫氖潜镜氐腁ND操作而不是兼容函數(shù)。 Dim b As Boolean b = Function1() And Function2() 中,只有當(dāng)Function1的結(jié)果為True時(shí)才會(huì)計(jì)算Function2。因?yàn)閂isual Basic.NET中的AND運(yùn)算執(zhí)行的是邏輯AND操 作,如果Function1結(jié)果為False,AND結(jié)果肯定是False,為了加快速度就不再執(zhí)行Function2的了。但是如果 Function2另有目的,例如用于避免某些錯(cuò)誤,那么就會(huì)出現(xiàn)不可預(yù)知的錯(cuò)誤,那么上面的代碼升級(jí)后就會(huì)象下面 的樣子: Dim b As Boolean b = VB6.AND(Function1(), Function2()) 為了不在升級(jí)代碼中出現(xiàn)兼容函數(shù),原來(lái)的代碼需要做如下的改動(dòng): Dim b As Boolean Dim c As Boolean Dim d As Boolean c = Function1() d = Function2() b = c And d 能集成在 .NET語(yǔ)言中。因?yàn)橛羞@個(gè)改變,你需要再你的Visual Basic 6.0工程中使用常量True而不是-1來(lái)表示真 值,使用Boolean類型而不是整數(shù)類型變量保存Boolean數(shù)據(jù)。下面的代碼說(shuō)明了Visual Basic 6.0和Visual Basic.NET 之間的不同: Dim i As Integer i = True If i = -1 Then Else End If 在Visual Basic 6.0中,結(jié)果為True,而在Visual Basic.NET中結(jié)果為False。 如果對(duì)代碼做如下改動(dòng),程序在兩種語(yǔ)言下運(yùn)行都會(huì)顯示True Dim i As Boolean i = True If i = True Then Else End If 通過(guò)上面的范例可以看出在程序中需要注意兩點(diǎn): 1、使用常量True和False來(lái)判斷是否而不要使用0和-1 2、使用Boolean類型變量?jī)?chǔ)存Boolean數(shù)值而不要使用Integer類型變量 如果在你的程序中沒(méi)有這么做的話,在升級(jí)后你還需要做大量的手工改動(dòng) 避免Null傳播(Propagation) 的范例,結(jié)果V都將是Null Dim V V = 1 + Null V = Null + Right$("SomeText", 1) V = Right("SomeText", 0) Basic 6.0中有兩個(gè)求左值的函數(shù):Left和Left$前者返回值為Variant類型并且可以為空,Left$函數(shù)返回值為String 類型。在Visual Basic.NET中,只有一個(gè)Left函數(shù),該函數(shù)總是返回String類型值 Basic.NET中,下面的函數(shù)將不再返回Null值: Chr Mid Command Oct CurDir Right Date RTrim Environ Space Error Str Hex Time LCase Trim LTrim UCase 由于數(shù)據(jù)庫(kù)中的數(shù)據(jù)可以包含Null值,所以你需要在程序中對(duì)獲得的數(shù)據(jù)加入代碼檢測(cè)其值是否為Null。 使用以0為下界的數(shù)組 |