VB.NET公共運行環境配置要點解析
作為一名有經驗的編程人員來說,VB.NET語言的應用應當是非常熟練的。因為它的功能強大,應范圍廣,深受開發人員的青睞。我們會在這里為大家介紹VB.NET公共運行環境相關概念,希望能有助于大家對VB.NET語言的理解。#t#
迄今為止,業界對VB.NET討論得最多的特色或許就是CLR.VB.NET運行在CLR之上,正是CLR 為VB.NET帶來了許多關鍵的新特色(包括缺點在內)。例如,CLR使得VB.NET支持跨語言的繼承以及自由線程。
在VB6 中,分布式VB程序要求有VB運行時庫msVBvm60.dll支持,即該運行時庫必須隨同應用一起分發。其他許多語言,比如C++ 和Java,也有類似的要求。
在。NET 中,所有VB.NET公共運行環境.改用CLR帶來了幾個重要的結果:現在所有Visual Studio 語言都共用同樣的IDE 、同樣的窗體引擎、同樣的異常處理機制,等等。它意味著Visual Basic在很大程度上已經可以和。NET 的其他語言相提并論,如C#等。然而,對于CLR 的異議仍舊存在,VB業界仍在激勵地爭辯它地價值。
不管應用是用VB、C#還是其他。NET 語言編寫,所有VS.NET代碼都是編譯成中間語言(Intermediate Language ,IL)。當應用運行時,一個實時編譯器(just-in-time compiler ,或稱為JIT )就把IL代碼編譯成機器語言。在理論上,它意味著為非Windows 的平臺構造。NET 運行環境是可能的,但目前還沒有出現有關這類系統的正式消息。IL有一個缺點:正如VB在5.0 以前的版本,IL代碼對于類似的反向編譯工程很敏感。由于存在這種可能性,許多開發者對于。NET框架的整體安全性抱有懷疑。
對CLR 進行優化影響IL層次上的代碼,它使得所有使用CLR 的語言受益。然而,對于特定語言的優化涉及到如何把代碼編譯成IL代碼,它根據特定語言的語法進行。因此,。NET 各種語言之間存在一定的性能差異是必然的。但不管如何,從整體上來看這仍舊是好事,例如CLR 為VB帶來了和C#一樣的調試和分析工具——之所以能夠如此,是因為它們都使用一樣的工具。
CLR 提供了***的跨語言集成能力,其中包括跨語言繼承代碼的能力。
所有使用CLR 的語言都使用一個公共類型系統(Common Type System),它使得開發那些運用多種語言的應用變得更為容易。
在VB.NET公共運行環境之內運行的代碼稱為“受管理的代碼”(Managed Code),受管理代碼所使用的內存由CLR 全面控制。受管理的代碼有著許多優點,包括交叉語言集成、跨語言異??刂埔约耙粋€組件交互的簡化模型。Visual Basic.NET只能以受管理代碼方式運行,與此相對應,C#卻具有將代碼轉入非受管理方式運行的能力(運行在CLR 之外),比如執行指針處理之類的操作。這是VB.NET不能與C#相提并論的地方之一。然而,這種能力的是否重要,對于不同的人、不同的用途來說都有所不同。
由CLR 導致的體系上的不同不僅僅是跨語言繼承、共享功能和受管理代碼,它還有更深刻的意義。Visual Studio.NET 的底層體系不再是COM ;另外,VB.NET中所有東西都是對象,甚至連字符串也一樣。由于這些原因以及其他許多原因,Microsoft 改變了底層體系管理對象的方法。COM 系統通過引用計數方式管理對象,每當對象被引用時,引用計數就增加。當對象引用超出作用范圍或者被釋放時,計數器的值就減少;一旦引用計數為0 ,對象就被釋放。Microsoft 聲稱。
NET 體系中的引用計數開銷實在太大,使得。NET 采用引用計數不再合適,因此它就放棄了引用計數,改用垃圾回收(Garbage Collection)。
大約40年前,John McCarthy 設計了LISP語言,它是可考證的***種編程語言。LISP運行時不斷地分配和釋放大量的小塊內存,由于那時的計算機內存遠遠沒有現在這么龐大,因此早期的LISP用戶很快感到內存不足,同時許多不再使用的內存卻未能利用起來。為了解決這個問題,McCarthy于1959年***次提出了垃圾回收的思想。
在一個真正面向對象的系統中,垃圾回收機制能夠很好地滿足分配和釋放大量小塊內存的需要。因此,Microsoft 在VS.NET中重新實現了垃圾回收機制。
CLR 垃圾回收器(CLR Garbage Collector )的主要任務就是監視程序使用的資源,當可用資源達到某個確定的極限時查找不再使用的對象,如發現有這類對象存在則釋放它們所占用的資源。垃圾回收的一個很大的優點是程序員無需再為大多數常見的循環引用擔心。在循環引用情形下,子對象擁有對父對象的引用,同時父對象又擁有對子對象的引用。在引用計數模式下,循環引用阻止了系統釋放和拆除任意一個對象。然而,垃圾回收器能夠找出這類循環引用并拆除它們。
垃圾回收機制同時也意味著,當對象的***一個引用被釋放時,對象并不一定立即被拆除。
采用垃圾回收機制的一個后果是:我們不能再希望類的Terminate 事件總是適時觸發。事實上,如果線程被阻塞的話,Terminate 事件可能完全不會觸發。
這就是所謂的“非確定的結束”(non-deterministic finalization),而COM 提供的則是“確定的結束”。由于缺乏“確定的結束”,再加上因為垃圾回收器重新組織和整理內存導致不能運用指針,新聞組中出現了對該問題激烈的爭論:有些人憎恨這些新的限制,因為他們依賴于“確定的結束”;有些人覺得無關緊要,因為他們并不依賴于Terminate 事件。
從引用計數轉變到垃圾回收僅僅是Visual Studio.NET 底層體系不再是COM這一變化的諸多必然結果之一。雖然VB.NET之內仍舊可以使用COM 對象,但這些對象必須通過封裝(Wrapper )才能訪問。任何時候,封裝都意味著性能的降低,甚至還有可能導致對象行為的異常。如果要遷移一個大量使用COM 對象的工程,你必須認真地進行計劃和測試,應用程序的某些部分可能還需要重新構造。
面向Web 的支持除了Windows Forms 新引擎之外,。NET 還包含了一個專門為構造Web 窗體設計的窗體引擎,稱為Web Forms.這個引擎的目標在于讓用戶能夠象創建傳統Windows 桌面應用的窗體一樣方便地創建Web 窗體。Web Forms是一種ASP.NET 技術,通過它我們可以使用熟悉的RAD (快速程序開發)工具構造出帶有執行代碼的窗體。不過,窗體中的ASP.NET 代碼以編譯方式在服務器端運行,經過處理后把結果HTML發送給支持HTML 3.2的瀏覽器。
客戶端事件數據由底層框架截獲并發送到服務器。這意味著應用界面不再受瀏覽器類型的約束,意味著有大量UI工具可供使用,意味著用戶可以充分發揮現有的窗體制作技巧。如果應用沒有必要做到瀏覽器中立,那么它就可以利用IE瀏覽器的各種特色。有了Web Forms ,我們將能夠更輕松地為那些具有Web 功能的應用構造出更好、更豐富的用戶界面。
VB.NET公共運行環境中另外一個面向Web 的重要特色是Web 服務。在Microsoft 的宣傳中,Web 服務被推崇為之所以要采用。NET 技術的重要理由之一。事實上,從根本上來說Web 服務是一種類似COM 的、通過Web 服務器和標準協議發布的對象。當然,Web 服務并不是嚴格意義上的COM 對象,但兩者作用方式類似。Microsoft 期待著各類公司都以Web 服務方式提供服務,期待著未來創建應用時只需簡單地“粘合”各種服務,就象今天借助Office和支持VBA 的應用通過VBA 構造新應用一樣簡單快捷。
從Microsoft PDC (Professional Developers Conference,專業開發者大會)的一個演示中,我們可以看出Microsoft 希望開發者如何粘合各種Web 服務。
在這個演示中,一個假想的醫生以Web 服務形式發布其時間表,示范如何通過Web 用智能電話和醫生訂立約會。Visual Basic.NET還允許查詢服務器,提取服務器支持的所有服務的元數據。Web 服務描繪了Microsoft 野心勃勃的戰略,然而,唯有時間才能告訴我們Microsoft 是否在大范圍推廣Web 服務上取得了成功。但不管如何,這個想法本身看來有著美好的前途。
為了減少與封裝和分發應用有關的問題,如令人畏懼的DLL Hell問題(在共享DLL 的應用之間,由于一個應用的升級而導致另一個應用無法正常運行的情況),Microsoft 作出了種種努力,它同樣也帶來了美好的希望。所有。NET 應用都封裝為程序集(Assembly)。程序集包含了描述各種運行需求的元數據。這種元數據稱為manifest,其中包括:程序集的標識信息(名稱,版本等),列出了所有文件依賴關系以及文件位置和文件版本的文件清單,外部依賴信息(帶有描述程序集必須用到、但開發者沒有自己創建的DLL 以及其他資源的數據)。程序集是通過manifest自我描述的,因此。NET 應用的運行并不需要修改注冊表。換句話說,。NET 應用不再要求注冊組件。在最理想的情況下,客戶機器上已經有了。
VB.NET公共運行環境,部署一個復雜的應用簡單到只需復制一個文件夾到目標機器。使用程序集的另外一個優點是:不同的應用可以擁有同一DLL 的不同版本,所有這些應用都互不干涉地在同一臺機器上運行。如果它能夠按照預期那樣獲得成功,DLL Hell和可怕的版本問題都將成為歷史。
Visual Basic.NET代表著VB的一次重大飛躍。盡管如此,把VB.NET看成是一種有著熟悉語法的新語言而不是對舊語言的簡單升級或許是對待VB.NET較為正確的心態。