向Visual Basic程式員介紹My命名空間(一)
最後更新:2017-02-28
來源:互聯網
上載者:User
visual|程式|程式員|命名空間 Excerpted from “Microsoft Visual Basic Programmer’s Introduction to Whidbey” by Sean Campbell, Scott Swigart, Kris Horrocks, Derek Hatchard, and Peter Bernhardt.
Publisher, Microsoft Press, ISBN # 0-7356-2058-X. © 2004, Microsoft Corporation
應用:My命名空間
新概念
當你用VB6編寫應用程式時,你曾用到VB的運行庫,這其中包含一大批COM對象;以及所用Windows版本的Win32 API。最初版本的.NET Framework將這些的大部分內容整合到一個龐大的類庫中,這就是我們熟悉的Base Class Library(BCL)。在BCL中有些類支援對系統底層的訪問,有些類能讓你方便地訪問電腦硬體的資訊,還有些類能讓你在不同應用程式間進行網路通訊、加密資料以及訪問註冊表等等。如果你想作一個徹底的.NET開發人員,你必須掌握BCL和它所提供的豐富的功能。如果對BCL缺乏足夠的瞭解,開發人員就會做出很多不必要的重複勞動,重新構建一些已經存在的類。有時.NET提供的某種功能“隱藏”得太深,或者相對於龐大的.NET Framework顯得太不起眼了。有很多人寫文章講述的用他們祖傳的演算法來實現的功能,其實可以用Framework中的某些類非常容易地實現,比如Path或PasswordDeriveByes。事實上,許多人都會告訴你學習.NET其實不是在學習Visual Basic或C#,而是在學習BCL。 但是,學習BCL也是一項巨大的挑戰,因為它太龐大了。有些非常常用的類和那些幾乎用不到的類混雜在一起。為了更容易找到那些架構中最常用的類,Visual Basic 2005現在提供一種“捷徑”命名空間——My。你可以通過使用My輕鬆地訪問電腦、應用程式以及使用者資訊,還能用它來訪問表單和Web服務。要注意的一點是My僅能在使用Visual Basic 2005進行開發時使用,在使用C#時是不能直接存取到My的。有必要提及My命名空間並不僅僅是一個捷徑。有些情況下,My命名空間提供的類比你在BCL大量的命名空間中簡單搜尋得到的類功能更強大。比如說Folder對象提供更多屬性,如Drive,該屬性在System.IO.DirectoryInfo類中根本不存在。My還讓微軟思考將“電腦”、“應用程式”或“使用者”看作完全的實體,並且自問 “對於一個‘電腦’你應當能做什麼”這樣的問題。思考的結果包括My.Computer.Network.Ping,這讓你能用一行代碼實現對網路電腦的Ping操作。你現在用的這項功能以前只有調用COM庫,甚至Win32 API才能做到,而現在它能夠在My中輕鬆地找到並使用。
My命名空間下面分成如下幾個專區:
My物件模型
對象 描述
My.Application
包含了當前運行應用程式的資訊,如標題、當前路徑和版本等。它還能訪問環境變數,可以讓你輕鬆地書寫本地應用程式記錄檔或自訂日誌等。
My.Computer
提供應用程式所啟動並執行本機電腦硬體或系統底層的資訊。比如註冊表、印表機、鍵盤、現實器等。這些都是你能通過該類訪問到的對象。
My.User
包含目前使用者的資訊,包括使用者顯示名稱、網域名稱稱,組群名稱等。
My.WebServices
它允許你輕鬆地訪問已經在項目中添加了Web引用的Web服務。
My.Forms
一個當前項目中存在的表單的集合。你可以通過它顯示、隱藏這些表單而不需要在代碼中顯式建立他們的對象。(譯註:這太棒了,VB6程式員的福音)
正如你所見,My命名空間給你了一個便捷的方法,讓你可以在日常開發中直接存取那些常用的功能。
深入代碼
在這一節,我將通過一個簡短的樣本,帶你深入認識My命名空間。這個例子在一定深度上探索了My裡面的世界。這個程式有很多選項卡,每個選項卡注重My的一項主要功能。
圖1
My.Application 選項卡.
映像修改– 需要刪除 My.Datasources – 這一部分已經去掉了
My.Application
第一個選項卡——My.Application上面有一個資料表格控制項,它能顯示My.Application對象的大部分屬性值。控制這個資料表格控制項的代碼如下:
CLRVersionInUse已經去掉了(你能在M2 bits見到它,但已經被去掉了)
myAppDS.MyApplication.AddMyApplicationRow("CLR Version In Use", _
My.Application.CLRVersionInUse.Major.ToString() & "." & _
My.Application.CLRVersionInUse.Minor.ToString() & "." & _
My.Application.CLRVersionInUse.Revision.ToString() & "." & _
My.Application.CLRVersionInUse.Build.ToString())
myAppDS.MyApplication.AddMyApplicationRow("Command Line", _
My.Application.CommandLine)
Dim cmds As String
For Each cmd As String In My.Application.CommandLineArgs
cmds &= ", " & cmd
Next
myAppDS.MyApplication.AddMyApplicationRow("Command Line Args", _
cmds)
myAppDS.MyApplication.AddMyApplicationRow("Company Name", _
My.Application.CompanyName)
myAppDS.MyApplication.AddMyApplicationRow("Company Name", _
My.Application.CompanyName)
myAppDS.MyApplication.AddMyApplicationRow("Culture", _
My.Application.Culture.CurrentCulture.ToString())
myAppDS.MyApplication.AddMyApplicationRow("Description", _
My.Application.Description)
myAppDS.MyApplication.AddMyApplicationRow("Number of Procs", _
My.Application.EnvironmentVariables.Item("NUMBER_OF_PROCESSORS").Value)
myAppDS.MyApplication.AddMyApplicationRow("File Name", _
My.Application.FileName)
myAppDS.MyApplication.AddMyApplicationRow("Folder", _
My.Application.Folder.ToString())
myAppDS.MyApplication.AddMyApplicationRow("Legal Copyright", _
My.Application.LegalCopyright)
myAppDS.MyApplication.AddMyApplicationRow("Legal Trademark", _
My.Application.LegalTrademark)
myAppDS.MyApplication.AddMyApplicationRow("Event Log Name", _
My.Application.Log.EventLogName)
myAppDS.MyApplication.AddMyApplicationRow("Mouse Pointer", _
My.Application.MousePointer.ToString)
myAppDS.MyApplication.AddMyApplicationRow("Product Name", _
My.Application.ProductName)
myAppDS.MyApplication.AddMyApplicationRow("CUser Application Data Path", _
My.Application.SpecialFolders.CurrentUserApplicationData.ToString())
myAppDS.MyApplication.AddMyApplicationRow("Title", _
My.Application.Title)
myAppDS.MyApplication.AddMyApplicationRow("Version", _
My.Application.Version.Major & "." & My.Application.Version.Minor & "." & _
My.Application.Version.Revision & "." & My.Application.Version.Build)
myAppDS.MyApplication.AddMyApplicationRow("Working Folder", _
My.Application.WorkingFolder.ToString()
上面這段代碼故意寫得有些羅嗦。這段代碼是在利用反射列舉應用程式的屬性。把他們都列在代碼裡是為了讓你看得更清楚,並瞭解從一個特定的屬性中可以得到什麼。從屬性中取得的每個數值都被放到一個類型化的資料集中。接著My.Applicaton選項卡中的一個資料表格控制項綁定到這個資料集中的My.Application資料表。通過輕鬆訪問My.Application對象的屬性,你可以擷取有關你的應用程式的大量資訊。下表列出了My.Application對象的詳細屬性。
My.Application
屬性/方法 描述
CommandLine
返回完整的命令列——exe加上所有參數。
CommandLineArgs
返回一個包含所有命令列參數的集合。
CompanyName
返回在AssemblyInfo.vb中指定的CompanyName資訊。
Culture
返回一個culture對象,通過它你可以確定當前應用程式所在的文化設定。
Description
返回在AssemblyInfo.vb中指定的應用程式描述資訊。
Environment Variables
列舉當前電腦的環境變數。
FileName
返回應用程式的程式集名稱。
Folder
返回應用程式所在的檔案夾。
Exit
關閉應用程式。
LegalCopyright
返回在AssemblyInfo.vb中指定的應用程式合法著作權。
Legal Trademark
返回在AssemblyInfo.vb中指定的應用程式合法商標。
Log
允許你在本機電腦產生自訂的檔案日誌或應用程式記錄檔。
MousePointer
允許你更改應用程式的滑鼠指標。
ProductName
返回在AssemblyInfo.vb中指定的應用程式產品名稱。
SpecialFolders
返回一個Special Folder對象,讓你訪問一些特殊的檔案夾,如案頭、Application Data等。
Title
返回可執行程式集的標題
Version
返回程式集的版本資訊
WorkingFolder
返回應用程式的工作目錄
My.Application在開發中的相關應用
My.Application提供了大量的功能,但是所用的代碼要比用VB6或VB.NET少得多。下面我們看看如何使用My.Application。比如說我們要編寫一段代碼來寫事件記錄,現在只要下面這點代碼就夠了:
My.Application.Log.WriteEntry("Application Starting", _
EventLogEntryType.Information, 1000)
上面的代碼會在本地應用程式事件記錄檔中寫入一條記載。以前用VB.NET的時候如果你想寫入事件記錄需要寫很多行代碼。如果用VB6,你只能使用App對象提供的非常有限的日誌功能,你不能指定事件ID,不能寫入系統或安全日誌,也不能建立你自訂的日誌。
還有一個例子可以很明顯地對比使用My前後所需代碼用量的減少,那就是當你需要產生一個自訂日誌,並希望寫入一個文字檔的時候。
My.Application.Log.FileName = My.Application.Folder.ToString() & _
"\logfile.txt"
My.Application.Log.FileType = Monitoring.LogFileType.Xml
My.Application.Log.WriteEntry("Application Starting", _
EventLogEntryType.Information, 1000)
使用這些代碼,要寫入的資訊除了寫進應用程式事件記錄檔中意外,還被寫到一個自訂的XML記錄檔中去。你可以使用My.Application.Log的FileMaximumSize屬性設定檔案的最大尺寸。你可以指定一中記錄檔的類型,可以是XML,也可以是用My.Application.Log.FileType屬性指定的Tab分割類型。你能編寫程式控制使用或不同日誌功能,還可以在運行時變更記錄檔檔案。
Figure 2圖二
XML 日誌輸出
My.Application還可以讓你用一行代碼直接存取很多應用程式層級的資訊。下面有一些這方面的例子:
· 用Folder屬性快速確定你的應用程式所在檔案夾。
· 用MouseCursor快速設定一些預設的游標類型,如AppStaring,,Help等
· 快速存取一些程式集的原資料,如產品名稱,公司名稱等。
<未完待續>