VB.NET開發(fā)創(chuàng)建.NET應(yīng)用程序
VB.NET編程語言已經(jīng)推出,就為廣大開發(fā)工作者們提供了非常大的好處,其特有的功能大大的吸引了編程人員的眼球。我工作過的許多公司在選擇VB.NET開發(fā)作為他們的核心開發(fā)工具時都經(jīng)歷了一個長時間的抉擇,他們所關(guān)心的最主要的問題之一是如果他們不使用C#語言就不能開發(fā)出純.NET框架代碼。#t#
主要有兩個原因使他們得出這樣的結(jié)論:首先,由于VB(6.0或早期版本)運(yùn)行時的限制,VB在開發(fā)COM構(gòu)件的能力方面不如C語言功能強(qiáng)大,他們關(guān)心這些限制是否在.NET中依舊存在;再者,由于微軟提倡將C#作為在.NET平臺上的主要開發(fā)工具,很多VB開發(fā)者懷疑微軟是否已經(jīng)在VB.NET改進(jìn)了VB先前版本的功能。
有個客戶曾經(jīng)跟我提起過這個問題,還特意請求我?guī)椭墓驹诓灰蕾嘨B6中的任何功能時如何使用VB.NET作為純.NET開發(fā)語言。當(dāng)我問他為什么他認(rèn)為VB.NET不是純.NET開發(fā)語言時,他告訴我他最近將一個項(xiàng)目從VB6升級到VB.NET時,他在VB.NET中看到有很多象Imports Microsoft.VisualBasic和Imports Microsoft.VisualBasic.Compatibilit的輸入語句,這些語句表明了VB.NET開發(fā)依舊在使用早期VB版本的一些功能;他說“如果VB.NET開發(fā)是.NET環(huán)境中一流的開發(fā)語言,為什幺還要用到早先VB版本中的功能呢?”。為了回答他的這個問題,并且給VB.NET的開發(fā)者提供一個如何使用這些包的建議,我將在此文章中解釋為什么微軟還在.NET平臺中實(shí)現(xiàn)VB早期版本的中的一些功能的原因。
VB中的核心動態(tài)鏈接庫(DLL)
將核心VB語言建造到.NET框架的方式同C#一樣,主要的區(qū)別是微軟為VB的開發(fā)者將兩個附加的庫增加到.NET中。首先,Microsoft.VisualBasic是.NET中可重新分發(fā)包的一個重要組成部分,它是VB早期版本的功能在.NET中的一個實(shí)現(xiàn),同時兩者也有一些細(xì)微的差別。實(shí)際上,有些VB函數(shù)(尤其是類型轉(zhuǎn)換部分的函數(shù))比.NET的通用語言運(yùn)行時(CLR)所提供的對象有著更好的性能。例如,使用CInt()就比使用Convert對象要好;另外,有些VB函數(shù)替你做了一些額外的工作,例如,函數(shù)CStr()在轉(zhuǎn)換字符串時也自動進(jìn)行了區(qū)域性方面的處理,如果你用Convert對象就必須自己做這些額外的工作。
同時.NET中的庫也提供了VB開發(fā)者原來經(jīng)常使用的一些通用環(huán)境常量,例如,vbCrLf回車換行符。其實(shí)如果你不想使用原來的老式常量,你能使用System.Environment.Newline方法或System.Convert.ToChar(13)&System.Convert.ToChar(10)來得到同樣的常量。象vbCrLf這樣的常量引用在.NET中直接被映像到框架底層的調(diào)用,所以在性能方面應(yīng)該沒有什么影響。像上面這種情況,編譯器將它優(yōu)化成單個字符串,如果它是一個變量,它就直接被映像到\r\n,將它翻譯成一個回車換行符。VB早期版本的函數(shù)也直接被映像到.NET框架底層的調(diào)用,象msgbox語句直接映像成.NET框架中的MessageBox,這種情況由于兩者編譯完了以后生成的中間語言(IL)基本上是相同的,所以在性能方面幾乎沒有什么影響。
在VB早期版本中的有些特性,象函數(shù)InputBox、控制數(shù)組和對ADO的支持在.NET框架中的沒有直接的等同物。但是對于這些不能直接支持的特性,微軟提供了另外一個名為Microsoft.VisualBasic.Compatibility的庫,這個庫是為使VS.NET具有向下兼容性而提供的,所以如果你的VB應(yīng)用程序沒有升級一定不要使用其中的功能。Microsoft.VisualBasic.Compatibility包含對控制數(shù)組、環(huán)境函數(shù)和字體轉(zhuǎn)換的支持。微軟所提供的另外一個名為Microsoft.VisualBasic.Compatibility.Data庫可以支持ADO對象、接口和方法,使用這個庫可以象早期VB版本中的ADO一樣來操縱數(shù)據(jù)庫。關(guān)于是否應(yīng)該花費(fèi)時間和精力來學(xué)習(xí)這些老版本中的功能,你應(yīng)該留意一下VS.NET幫助文件的警告信息。
“警告:當(dāng)你用Visual Basic.NET開發(fā).NET應(yīng)用程序時,最好不要使用VisualBasic.Compatibility命名空間中所提供的功能,將來的VB版本可能不再支持此命名空間,使用.NET中別的命名空間所提供的相同功能的函數(shù)和對象。”
由此可見,在使用VB.NET開發(fā)時,你應(yīng)該注意可以使用VB早期版本中的那些功能,不可以使用那些功能,不可使用的部分.NET中別的包中都提供了相同的功能。清楚這些以后,這樣你既可以使用VB早期版本中的一些功能,又可以開發(fā)純.NET應(yīng)用程序。所以,你大可不必為創(chuàng)建純.NET應(yīng)用程序放棄在VB上的多年的培訓(xùn)投資和實(shí)踐經(jīng)驗(yàn)而使用C#,因?yàn)閂B.NET同樣可以利用.NET框架提供給C#的所有功能。實(shí)際上,我曾經(jīng)向我的客戶推薦不要使用微軟提供的升級向?qū)?,因?yàn)樵撓驅(qū)г谏夁^程中會將.NET中所提供的向下兼容的庫增加到.NET項(xiàng)目中,所以應(yīng)該直接構(gòu)造.NET應(yīng)用程序,然后將原來應(yīng)用程序中的代碼移植到新應(yīng)用程序中,用.NET新的功能替代不被.NET支持的老式功能,這樣開發(fā)出的應(yīng)用程序?qū)⑹羌?NET應(yīng)用程序。
Microsoft.VisualBasic支持純.NET應(yīng)用程序
Microsoft VisualBasic是VB語言自身在.NET框架中的實(shí)現(xiàn),它所提供的功能是真正基于.NET的,而不僅僅是為了與VB早期版本的兼容。在VS.NET項(xiàng)目中的那些關(guān)于Microsoft.VisualBasic的Imports語句不會在性能方面造成什么影響,主要作用是當(dāng)你用到相關(guān)功能后,它會告之編譯器在什么地方可以找到調(diào)用的代碼。
.NET框架會長期保留Microsoft.VisualBasic包,并且總是可以被重新發(fā)布。正如VB.NET產(chǎn)品組的一個成員所說,“你并不能因?yàn)閯h除Microsoft.VisualBasic.dll而獲得什么,這個動態(tài)鏈接庫中的功能并不是VB早期版本所遺留下來的,它們在VB.NET開發(fā)中已經(jīng)被重新實(shí)現(xiàn)了,并且被VB的開發(fā)者所熟知,具有向前兼容性,所以使用它不會對應(yīng)用程序有什么危害。最后,如果你重用VB例子中的代碼,你也會用到這些功能。刪除這個動態(tài)鏈接庫并不能使你開發(fā)更純的.NET應(yīng)用程序,你只是丟失了一些對你有用的類罷了。”