应用:My命名空间
应用: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的一项主要功能。
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分割类型。你能编写程序控制使用或不同日志功能,还可以在运行时更改日志文件。
XML 日志输出
My.Application还可以让你用一行代码直接访问很多应用程序级别的信息。下面有一些这方面的例子:
·用Folder属性快速确定你的应用程序所在文件夹。
·用MouseCursor快速设定一些默认的光标类型,如AppStaring,,Help等
·快速访问一些程序集的原数据,如产品名称,公司名称等。