為什麼選擇VB.NET?(轉貼)

來源:互聯網
上載者:User
對於.NET,人們比WEB應用程式投入了更大的關注。VB第一次承諾,可以額外提供對控制台程式以及Windows服務的支援。因為這一點,Rob Macdonald回過頭來問:用VB.NET究竟可以做什嗎?換一句話說,VB.NET是否適合你?
目前為止,許多軟體公司(包括Microsoft)都將他們的產品壓縮在一個安裝包裡提供給開發人員。我們就一直忍受著那些令人頭痛的配置和版本匹配的問題。我們為了產品在真實環境中的運行絞盡腦汁。為了測試,我們還要花費大量的時間來設定一個乾淨的機器。接下來的幾年中,絕大多數的軟體供應商和獨立軟體開發工作室將擺脫這樣的工作,原因很簡單――這太好了。

打個比方吧,當Microsoft Office XP投入市場時,你既可以選擇按照原來產品包的價格購買,或者支付少量的許可費用從而租用一年。將軟體象產品那樣的買賣轉變為租用服務的方式,這就是一部分的轉變手段。最終,我想你可以不必在你的PC中(或者PDA,手機,冰箱,無論什麼)安裝任何東西。你只需要通過永遠線上的網路,找到存放你所需要軟體的那台伺服器即可。在某些領域,這已經是很普遍了(WEB e-mail服務就是一個絕佳的例子)。不過,當大多數的軟體都可以通過這樣的方式快速的獲得時,對我們這樣的開發人員來說,是不是合適呢?

因此,從某種程度而言,我認為Microsoft推出VB.NET就是試圖協助我們這些開發人員為這些即將來臨的以服務為中心的範例做好準備。WEB服務之所以受到如此多的關注,是因為通過這些技術(HTTP,XML,SOAP),任何作業系統(包括Windows, Linux, IBM, Palm)都將有可能以這樣的方式製作並提供各自的服務。這當然也部分解釋了為什麼HTTP,XML,SOAP都是那樣的簡單。因為電腦本身就必須“讀懂”他們。

當然,並不是所有的應用程式都可以通過基於服務的方式來獲得。VB.NET針對完成案頭上的一些新的、更好的應用,提供了一些真正實際的新特性。舉例而言,在VB6中使用的那些“美麗的”表單只適用於VB,而在.NET中新的Windows表單不單可以提供給其他.NET語言使用,而且還有一些重大的創新。我特別高興的看到,它對視窗縮放的支援,以前這都是需要我自己編寫的,現在我只要簡單的點擊滑鼠就可以建立起視窗縮放的規則。

控制台程式

VB.NET帶來最大的好處之一就是它允許VB開發人員實現一些以前做不了的事。如類的繼承和結構化的錯誤處理。另一項讓我們長久等待的功能就是它可以用來編寫那些通過命令列和使用者互動的應用程式了。VB.NET使這個工作變得簡單,同時保留了所有.NET的功能。

在Visual Studio.NET中,你可以建立一個新的工程,叫做“控制台程式(Console Application)”。其實,你完全也可以不通過Visual Studio來建立VB.NET的應用程式。你真正需要的只是.NET Framework SDK和記事本,因為VB編譯器作為一個完全獨立的產品,已經和Visual Studio脫離了。(事實上,無論是編譯VB的程式,還是為已定義的資料集自動產生原始碼,這些Visual Studio.NET看來神奇的功能,都是通過.NET Framework中附帶的工具來實現的。Visual Studio.NET只是把他們整合到了一個易用的開發環境中。作為獨立的命令列軟體他們都是可用的。)

就讓我們用命令列的方式建立一個命令列的程式吧。以下為我在記事本中輸入的一些文本,並把它儲存為檔案“speaktome.vb”:

Imports System
Imports Microsoft.VisualBasic
Module Module1
  Sub Main()
      Dim i, count As Integer
      Try
        count = CInt(Command())
        For i = 1 To count
            Console.WriteLine("Hello")
        Next
      Catch
        Console.WriteLine("Invalid argument")
      End Try
  End Sub
End Module

這段代碼按照count數值,迴圈運行若干次,每次按照標準輸出文字資料流,輸出“Hello”。預設的它就是一個命令列控製程序。程式通過調用command()函數初始化count變數,它取代了我們在VB6中熟悉返回命令列中在程式名後面出現的所有文本的全域變數Command。

儘管這些代碼已經是相當的直接了,我們仍然需要一些註解。首先,我們注意到一開始它就使用Imports申明了對兩個名字空間的引用。名字空間System包含了Console類,而名字空間Microsoft.VisualBasic則包含了命令函數,包括全部很多新的功能。當你在Visual Studio中建立一個VB.NET工程時,這些名字空間會被自動的匯入,但當我們直接使用編譯器的時候,我們就需要自己手工的添加他們了。並且注意我聲明我那兩個變數的方式。在vb6中,象這樣的dim聲明,會建立一個Variant,一個整數,但在.NET中。這種傳統的VB方式徹底消失了,我得到了我所預期的兩個整數。

VB.NET編譯器可以處理不同的參數,但當我只是將.vb檔案作為一個單一的參數傳遞給它時,它將編譯一個和它同名的EXE檔案。圖1(http://msdn.microsoft.com/library/en-us/dnvbdev01/html/rob0301fig1.jpg)顯示了當我編譯完這個程式時的控制會話。(編譯器叫做“VBC”)
命令列的編譯器使得自動化的編譯進程變得簡單。能夠編寫控制台應用程式,對於VB來說,雖然微不足道但確實是一次有價值的擴充。

Windows服務

另一種新類型的應用程式是Windows服務。除了那些膽大的VB開發人員,這可能超越了其他人的視野。典型的,這是一些長久啟動並執行程式,而並不需要依靠登入使用者或客戶程式來保持它的運行。它們沒有自己的使用者介面,可以在它們自己專屬的安全層級和會話上下文中運行。我們比較熟悉的Windows服務範例包含了從列印集區到SQL伺服器以及它的分散式交易協作(DTC)。

服務只可以運行在NT和2000下運行,它們通過Microsoft Management Console (MMC)提供了一個專門的管理介面。你可以想象,編寫一個服務會涉及到非常多的內容,在這裡我不可能花費太多的篇幅,但是我可以告訴你如何建立一個簡單的範例。

在.NET beta1版的線上協助中,有許多相關的資訊-在寫這篇專欄時我就在使用beta1版--如果你打算建立一個可操作的Windows服務程式,你應該仔細的看一看。
我介紹一下我將建立的Windows服務原型,它用來記錄指定的機器上正在啟動並執行進程數量。是的,我知道我可以使用PerfMon來實現這個功能,不過我只是裝作我想擴充我的服務,以便它可以計算一些統計功能,並把他們寫入資料庫,也許還可以在超過某一個閥值時,發mail給我。

我首先開始建立一個新的Visual Studio.NET應用程式,選擇VB作為我的開發語言,而工程類型則是Windows服務。這個操作自動為我建立了一個新的類,它是繼承了.NET內建了System.ServiceProcess.ServiceBase類。同時它提供給我一個可視化的設計器,一個圖形化的快速開發工具,它特別的為那些本身沒有使用者介面的工程。我可以點擊這個設計器,設定我的服務的名字(我命名為"Process Tracking")。接著我從工具列中拖了兩個元件到設計器中-一個PerformanceCounter元件、一個Timer元件。我可以設定通過屬性欄來設定它們,感覺上他們是那種可視的控制項,儘管我不需要一個表單來放置它們。我配置Timer每60秒啟用一次,PerformanceCounter則用來監控在我機器上啟動並執行進程數量。你可以在圖2(http://msdn.microsoft.com/library/en-us/dnvbdev01/html/rob0301fig2.jpg)中看見設計器和PerformanceCounter元件的屬性設定。(我可以在設計器和代碼視窗之間進行切換,就如我建立一個表單一樣。)
Visual Studio產生預設的Sub Main,用來處理開始服務的運行。因為你的代碼是從ServiceBase類中繼承來的,那麼在服務的生命週期中,你可以擷取一些標準事件。這些事件在服務的生命週期中是至關重要的。它們是:

• OnStart
• OnStop
• OnPause
• OnContinue
• OnShutDown

這些代碼和VB6表單中的Load/Unload/Activate/Deactivate事件非常象。這裡是我對OnStart和OnStop設計的編碼:
Protected Overrides Sub OnStart(ByVal args() _
  As String)
  Dim fs As New FileStream ( "c:\log.txt", _
      FileMode.OpenOrCreate, FileAccess.Write)
  Dim sw As New StreamWriter(fs)
  sw.BaseStream.Seek(0, SeekOrigin.End)
  sw.WriteLine("Service Started: " + CStr(Now()))
  sw.Close()
End Sub

Protected Overrides Sub OnStop()
  Dim fs As New FileStream("c:\log.txt", _
      FileMode.OpenOrCreate, FileAccess.Write)
  Dim sw As New StreamWriter(fs)
  sw.BaseStream.Seek(0, SeekOrigin.End)
  sw.WriteLine("Service Stopped: " + CStr(Now()))
  sw.Close()
End Sub

這些常式都是開啟一個log.txt的檔案,寫入一個帶有時間戳記的簡單資訊。StreamWriter類提供了我們一個有效方法來建立一個字元流,而FileStream類則允許將StreamWriter類和一個物理檔案聯絡起來。關閉StreamWriter同時也關閉了他所串連的檔案。

Public Sub Timer1_Tick(ByVal sender As Object, _
  ByVal e As System.EventArgs) Handles Timer1.Tick
  Dim LogRecord As String = CStr(Now())+ "  "
  Dim fs As New FileStream("c:\log.txt", _
      FileMode.OpenOrCreate, FileAccess.Write)
  Dim sw As New StreamWriter(fs)
  LogRecord += PerformanceCounter1.NextValue.ToString
  sw.BaseStream.Seek(0, SeekOrigin.End)
  sw.WriteLine(LogRecord)
  sw.Close()
End Sub

如你所見,代碼用當前的時間初始化了一個字串,並將它和從PerformanceCounter讀出的值(它返回了當前在我機器上啟動並執行進程數量)串連起來。然後將這個字串寫入log檔案的最後。

將這個工程轉變為服務的話,需要比簡單的編譯它多做一些。首先,你需要增加一些安裝代碼,這樣程式在作為服務被安裝後就能正常工作了。很幸運,可視化的設計器提供了菜單選項("Add Installer"),它可以自動的產生這段代碼。然後,在你編譯了這個工程後,你需要在命令列狀態下運行InstallUtil.exe(這是.NET SDK的工具之一)處理已編譯的工程,這樣就將服務安裝到了你的系統上並建立必須的登錄機碼目。

一旦安裝了服務,我們需要啟動它-通過服務管理工具這一點都不難。不同的系統,訪問這個工具的方法也不同。在Windows 2000 Professional中,你可以在控制台中的管理工具得到。在圖3(http://msdn.microsoft.com/library/en-us/dnvbdev01/html/rob0301fig3.jpg)中,你可以看到服務已經被手動啟動了。你也可以看到它被配置為自動啟動,這就意味著下次我啟動我的系統,服務就開始運行,甚至在我還沒有登入系統之前。

圖4(http://msdn.microsoft.com/library/en-us/dnvbdev01/html/rob0301fig4.jpg)顯示了在我的系統上,這個服務產生的部分log。在這期間,我建立了一些進程,退出登入,再次登入,重啟機器(這也導致了服務的重新啟動)。

.NET工程類型

我著重介紹了兩類特定的VB.NET工程。對於VB開發人員可以實現的工程類型都列在了表1中(無論如何,在beta1中)還有一些和獨立於語言的工程類型,如:安裝,配置工程,資料庫工程,以及分析工程。


工程類型 描述

Windows Application 通過Windows 基於表單的使用者介面產生應用程式。
Class Library 為其他應用程式中產生class libraries。
Windows Control Library 在基於Windows的控制項。
Web Application 用靜態或動態Web頁面作為使用者介面產生應用程式。
Web Service 從其它應用程式中產生 Web Services 。
Web Control Library 產生在Web 應用程式中的控制項。
Console Application 用於產生命令列應用程式。
Windows Service 為Windows產生服務。

展示控制台與服務應用程式的原因之一是要強調一點:VB.NET 並不強制我們都要變成n層 Web開發人員。 事實上,Microsoft大量投資以提供對傳統傳統型應用程式的支援。雖然.NET意味著要學習大量的新東西,你可以把VB.NET看作是 一場雄心勃勃的大變革—它會掃清VB的一些弊端,在提供向後相容的前提下, 把它推向鼎盛。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。