向Visual Basic程序员介绍My命名空间

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等

· 快速访问一些程序集的原数据,如产品名称,公司名称等。

My.Computer
My的另一个功能块是Computer对象。My.Computer对象可以让你访问系统底层和应用程序所在硬件平台的信息。示例应用程序的第二个选项卡展示了你在My.Computer对象中能找到的有趣属性。



图三

My.Computer 选项卡

控制这个网格的代码如下:

myAppDS.MyComputer.AddMyComputerRow("Clock", _

My.Computer.Clock.LocalTime)

myAppDS.MyComputer.AddMyComputerRow("GMT Time", _

My.Computer.Clock.GmtTime)

myAppDS.MyComputer.AddMyComputerRow("Tick Count", _

My.Computer.Clock.TickCount)

myAppDS.MyComputer.AddMyComputerRow("GMT Time", _

My.Computer.EventLogs.Item("Application").ReadEntries().Item(1).Message)

myAppDS.MyComputer.AddMyComputerRow("CRTL Key Down", _

My.Computer.Keyboard.CtrlKeyDown.ToString())

myAppDS.MyComputer.AddMyComputerRow("Button Count", _

My.Computer.Mouse.ButtonCount)

myAppDS.MyComputer.AddMyComputerRow("Buttons Swapped", _

My.Computer.Mouse.ButtonsSwapped)

myAppDS.MyComputer.AddMyComputerRow("Mouse Exists", _

My.Computer.Mouse.Exists.ToString())

myAppDS.MyComputer.AddMyComputerRow("Wheel Scroll Lines", _

My.Computer.Mouse.WheelScrollLines.ToString())

myAppDS.MyComputer.AddMyComputerRow("Wheel Exists", _

My.Computer.Mouse.WheelExists)

myAppDS.MyComputer.AddMyComputerRow("Computer Name", _

My.Computer.Name)

myAppDS.MyComputer.AddMyComputerRow("Connection Status", _

My.Computer.Network.ConnectionStatus)

myAppDS.MyComputer.AddMyComputerRow("Connection Status", _

My.Computer.Network.IPAddresses(0).ToString())

myAppDS.MyComputer.AddMyComputerRow("Operating System Platform", _

My.Computer.OperatingSystem.Platform)

myAppDS.MyComputer.AddMyComputerRow("Version", _

My.Computer.OperatingSystem.Version.Major & "." & _

My.Computer.OperatingSystem.Version.Minor & "." & _

My.Computer.OperatingSystem.Version.Revision & "." & _

My.Computer.OperatingSystem.Version.Build)

myAppDS.MyComputer.AddMyComputerRow("Full Name HKEY_CURRENT_USER", _

My.Computer.Registry.CurrentUser.FullName)

myAppDS.MyComputer.AddMyComputerRow("Device Name", _

My.Computer.Screen.DeviceName)

这段代码与控制My.Application选项卡中的网格控件的代码非常相似。用一个类型化的数据集来装载My.Computer对象属性中获得的值,并绑定到一个表格控件。

My.Computer对象的元素不是都能够显示在表格控件里。下表列出的项目包括没有在表格控件里显示的属性或方法。

My.Computer

属性/方法 描述

Clock
允许你访问当前中时区时间和本地时间,以及计数刻度。

EventLogs
允许你访问本地事件日志信息以及创建或删除事件日志。

FileSystem
允许你进行许多IO操作,如复制文件、目录,移动文件、目录,读取或写入文件等。一般情况只需要一行代码。

Keyboard
允许你获取当前键盘上某些案件的状态。比如获取CTRL键、SHIFT键或ATL键是否被按下,或者CAPS LOCK/SCROLL LOCK是否处于打开状态等。

Mouse
允许你获取鼠标的状态以及它所附带的特定的硬件特征,如有几个按键,是否带有滚论等。

Name
告诉你当前正运行的本地计算机的名称。

Network
允许你访问本地计算机的IP地址信息,本地计算机的连接状态,还有Ping一个地址的功能。

Operating System
允许你访问本地计算机平台和版本的信息。

Registry
允许你访问注册表,并提供读取和写入注册表的功能。

Screen
允许你访问系统附带的监视器以及显示属性,如BitsPerPixel和WorkingArea等。


My.Computer在开发中的相关应用

My.Computer提供给你很多访问系统底层的功能,你可以用在很多方面。比如你可以用Network属性和其相关的Ping、PingWithDetails方法轻易地Ping一个网络地址。

Dim pingResult As Microsoft.VisualBasic.Net.PingResult = _

My.Computer.Network.PingWithDetails("www.3leaf.com")

If pingResult.PingSuccesses > 0 Then

Dim pingDetails As String = "Average Ping Time in MS: " & _

ingResult.AveragePingTimeInMilliseconds & vbCrLf & _

"Bytes Received: " & pingResult.BytesReceived.ToString() & vbCrLf & _

"IP Address: " & pingResult.IPAddress.ToString() & vbCrLf &_

"Ping Attempts: " & pingResult.PingAttempts.ToString() & vbCrLf & _

"Ping Successes: " & pingResult.PingSuccesses.ToString()

MessageBox.Show(pingDetails)

Else

MessageBox.Show("Ping of www.3leaf.com was not successful")

End If

这段代码最关键的部分是My.Computer.Network.PingWithDetails()。这行代码返回一个PingResult对象,其中包含了标准Ping动作所返回的数据。如果最少一次Ping操作成功的话,平均响应时间,获得的字节数,总Ping数目和成功数目都会显示在一个消息框中。My.Computer.Network还提供一个简化版的Ping,只返回True或False以示Ping成功与否。像这样Ping一个地址的功能可以让你方便地确定是否能与服务器正式建立通信。通过使用My.Computer.Network.ConnectionStatus,你还可以方便地确定当前网络连接的状态。ConnectionStatus属性根据计算机现在是否有网络连接而返回True或False。

My.Computer另一个很好的应用是在需要访问文件系统的时候。My.Computer.FileSystem提供给你更好的访问文件系统的方法,所需的代码比用VB.NET来实现更少。用My.Computer.FileSystem,你可以只用一行代码完成下列任务。

· 在文件后面附加文本。

· 从文件中读取所有文本。

· 复制文件夹时创建所有完整路径所需的父文件夹。

· 移动文件夹时创建所有完整路径所需的父文件夹。

你还能用Microsoft.VisualBasic.FileIO命名空间中的类型简化文件夹、文件和驱动器的操作。这些类型一般都是My.Computer.FileSystem对象的属性和方法返回的类型。

下面的例子是用My在文件末尾附加文本所需的全部代码。

My.Computer.FileSystem.AppendText(filePath, “Hello from " & _
“My.Computer.FileSystem”)

如果你想读取一个文件的全部文本,只需下列代码即可做到。

My.Computer.FileSystem.ReadAllText(filePath)

复制和移动文件夹变得非常容易。

My.Computer.FileSystem.CopyFolder(sourcePath, targetPath, True, True)

上面这行代码将文件夹从sourcePath复制到targetPath。最后两个布尔型参数指定targetPath是否要覆盖已经存在的文件夹以及指定是否需要创建所需的父文件夹。

刚才提到过FileSystem对象的许多属性和方法都可以返回Drive、Folder或File类型的对象。这些Microsoft.VisualBasic.FileIO名字空间中的对象封装了许多新的属性和方法,可以让一般的编程工作得到简化。比如可以用一行代码可以取得“我得文档”文件夹所在的驱动器。

My.Computer.FileSystem.SpecialFolders.MyDocuments.Drive.DriveName

更重要的是你可以获得“我得文档”文件夹所在的驱动器所剩余的磁盘空间。

My.Computer.FileSystem.SpecialFolders.MyDocuments.Drive.FreeSpace

用文件对象对特定文件或文件夹的操作同样非常容易。比如你可以用一行代码轻松地重名名文件。

My.Computer.FileSystem.SpecialFolders.MyDocuments.Drive.FreeSpace

My.User
My名字空间的下一个功能块是User对象。My.User对象允许你获取当前登录用户的信息如用户名,域名,以及查询他们所属的组群。



图 3

My.User 选项卡

控制表格控件的代码如下:

myAppDS.MyUser.AddMyUserRow("Display Name", _

My.User.DisplayName)

myAppDS.MyUser.AddMyUserRow("Domain Name", _

My.User.DomainName)

myAppDS.MyUser.AddMyUserRow("User Name", _

My.User.UserName)

myAppDS.MyUser.AddMyUserRow("Windows Role", _

My.User.WindowsRoles(0).ToString())

这段代码访问了当前用户的信息,这非常简单。你要做的所有事情就是访问User对象的属性。User对象是由下列属性或方法组成的。

My.User

属性/方法 描述

DisplayName
允许你访问当前登录用户的显示名称。

DomainName
允许你访问当前登录用户所属的域名,如果他属于某个域的话。

IsInRole
允许你查询用户是否属于一个特定的角色。

UserName
允许你访问当前登录用户的用户名。

WindowsRole
WindowsRole是一个包含当前登录用户帐号所属的全部角色/组群信息的集合。


My.User在开发中的相关应用

My.User能够给你相当多的关于当前登录用户的信息。在很多方面,My所提供的User对象都是学习或使用.NET Framework的绝佳捷径之一。

在以前版本的.NET Framework中,如果你想访问类似My.User所提供的功能,你必须写下面这么多代码。

Imports System.Security.Principal

Imports System.Threading.Thread



Dim winPrin As WindowsPrincipal = Thread.CurrentPrincipal

MessageBox.Show(winPrin.Identity.Name)

或者你得写成这样

MessageBox.Show(System.Threading.Thread.CurrentPrincipal.Identity.Name)

但是,在使用了My之后就变得如此直观。

My.User.UserName

这是一个用My简化对.NET Framework操作的一个经典例子。很多开发人员第一次面对Framework时,不会本能地想到要从Principal对象或从当前线程取得进程身份才能获得当前登录的用户的帐号名称。很多开发人员以为这种信息肯定是在更高级的抽象层次上才能得到。现在用My,获取这种信息既简单又快速。

My.WebServices和 My.Forms
接下来你将要学到 My命名空间另外两个主要功能,它们是My.WebServices和My.Forms。在进入这一节之前,我们先做一个简短的概述。

My.WebServices让你可以用和访问数据源一样简单的语法访问在项目中引用的Web服务。

dgOrders.DataSource = _

My.WebServices.Northwind.GetOrders().Tables("Orders")

如果用.NET Framework 1.0/1.1,要想做到上面那行代码的功能,你必须创建一个WebService的实例。用这种My.WebServices提供的功能可以快捷访问所有添加到Web引用的Web服务。

最后一个重点My.Form将带回一种在Visual Basic桌面程序中出现,并暂时消失在VB.NET中的标志性的编程风格。如果你曾经用VB6开发过,你肯定知道下面这种代码,如果你的项目需要显示某个窗体:

Form2.Show

在VB.NET时代,你不能再用这种简单的语法了。在VB.NET中只能用下列代码显示一个窗体。

Dim frm1 As New Form1()

frm1.Show()

使用My.Forms,项目中所有的窗体都变成Forms集合的成员。另外如果你想访问某个窗体默认的实例,你根本不需要使用My.Forms。就是说下面的代码是等价的。

My.Forms.Form2.Show()

Form2.Show()

在接下来的章节里,你将学到更多用此方法显示窗体的功能(译注:可惜我们看不到了)。

如果你想看一些My.WebServices和My.Forms的例子,你可以看看示例程序相关的选项卡。所有这些工能将在本书的后边详细地叙述。(本文档只是此书的样章,所以到此为止了,想看后面请到亚马孙书店购买此书)

结论

My命名空间对于一个开发人员来说主要有四项功能。首先它提供很多了以前版本的.NET Framework没有的功能。第二,它提供了很多快速访问.NET Framework的BCL的快捷方式。第三,在一定程度上,它让你想问题时能将“计算机”类的词当作逻辑实体来操作。第四,它让一些你熟悉的旧语法回归到了Visual Basic中,比如Form1.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值