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 A s String
For Each cmd A s String I n 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 等
· 快速访问一些程序集的原数据,如产品名称,公司名称等。
<未完待续>