DotNet · 2022年5月2日

通过 My 命名空间访问 .NET Framework 和项目

通过 My 命名空间访问 .NET Framework 和项目

发布日期: 2006-4-28 | 更新日期:
2006-4-28

本文将介绍以下内容:

Visual Studio 2005 中的 Visual Basic

My.Application、My.Computer、My.Forms、My.Resources、My.Settings、My.User 和
My.WebServices

本文涉及以下技术:Visual Basic 2005 和 .NET Framework

可以下载代码:VisualBasic2005.exe (145KB)

*

本页内容
为什么使用 My? 为什么使用
My?
探讨 My 探讨
My
My.Application My.Application
My.Computer 和 My.User My.Computer
和 My.User
处理您项目中的设置、资源等内容 处理您项目中的设置、资源等内容
结论 结论

当我开始着手写这篇关于 Visual Basic® 2005 的文章时,竟然不知从哪里下笔才好。我可以泛泛地介绍整个功能列表,从而为您提供一些有关强大的
IDE 功能(如编辑和继续、IntelliSense® 代码段或异常助手)的信息;可以概括介绍高级语言增强功能(如泛型、局部类和无符号类型);也可以简单介绍有关
Windows® 窗体、数据绑定、ClickOnce 部署等所有强大的 Microsoft® .NET Framework
增强功能。虽然所有这些功能都很有意义,但我在此只深入介绍 Visual Basic 2005 中最强大的功能之一:被称为 My 的命名空间。

为什么使用 My?

程序员遇到的最大问题之一是 .NET 的博大精深,这意味着找到适于某个特殊任务的最佳类相当困难。我读过很多由开发人员在新闻组发表的帖子,他们费尽周折地从其
Visual Basic .NET 或 C# 代码调用 Win32® API 函数,而事实上 .NET 已经提供了这个函数。他们为什么要设法调用
API?因为他们没有发现、没有注意到或可能不知道如何才能使用 Framework 的现有部分。My
命名空间提供了一种直观的导航层次结构,该层次结构通过易于理解的根对象提供现有 .NET 功能,针对的是您在一般情况下设法应对的实际任务和概念。

喔,这听起来不错,但意味着什么呢?为了快速说明 My 的好处,让我们来看看 GotDotNet
论坛上一个很常见的问题:“如何将文本文件的整个内容读取到一个字符串中?”如果使用 .NET Framework 1.1,方法如下:

Dim sr As New IO.StreamReader("c:\mytextfile.txt")
contents = sr.ReadToEnd
sr.Close()

它需要的代码不多,但无疑缺少直观性。对于很多人而言,为了找到 StreamReader 的路径,他们首先得找到 Stream 类、FileStream
等等,然后才能写出上述代码段。上述代码在 Visual Basic 2005 中完全适用,但如果使用
My,可在更短的时间内获得同样的信息,方法是编写以下代码:

contents = My.Computer.FileSystem.ReadAllText("c:\mytextfile.txt")

My.Computer.FileSystem 类只是 My 语言扩展中所包含的众多类中的一员,因此首要任务应是了解有哪些类可供使用。

将 My 比喻成 .NET Framework
的“快速拨号”功能最为恰当。这种简化是编程中的常用做法,通过它可以更为轻松地找到并执行正确的操作。在我遇到将被我或我的开发小组重复使用的多步进程时,通常会创建一个帮助函数。帮助函数通常只是一个简单的调用,该调用采用与最常见使用情况关联的参数,然后在后台执行多步进程,从而实现开发过程的顺利进行。大多数软件开发商都会构建这类帮助函数,然后采用相当普遍的做法,即将它们分组并组合为一些代码段集或共享库的形式(例如
MyCompany.Utilities 或 Duncan.NetworkUtilities)。

尽管在创建这些库时要进行大量重复工作,但是对于几乎所有的开发组而言,很多函数还是很有用的。My
命名空间将此帮助函数的思路提高到一个全新的层次,因为这些函数包含如此众多的功能,而且 Visual Basic 附带了这些函数。
只需将其视为一个库即可,这个库完全由可以提高效率的现成代码构成。

探讨 My

My
中提供了若干个截然不同的类,这些类将各种不同的函数归纳为以下七个常规范畴之一:My.Application、My.Computer、My.Forms、My.Resources、My.Settings、My.User
和 My.WebServices

通常,通过 My 中的类可以轻松访问以下两类信息之一:基础 .NET Framework
和当前项目的元素。My.Application、My.Computer 和 My.User 全都用于 Framework 功能,而
My.Forms、My.Resources、My.Settings 和 My.WebServices 全都用于处理当前项目的内容。当我从用于基础
Framework 的那些类开始介绍每个类时,会提供一些简单示例及有关它们包含的属性和类的信息。

如前文所述,使用 .NET Framework
时,有时很难找到所需功能,但您需要注意的问题并不止这一点。在某些特殊情况下,即使找到了所需类之后,要使其完备所需的特定步骤和构造函数参数的代码可能会达到数行,并且很难理解。用于
Framework 的 My 类(My.Application、My.Computer 和
My.User)旨在帮助您直接找到所需类以及对其进行设置,以便您可以随时进行自己的工作。

My.Application

My.Application 为开发人员提供了应用程序信息和服务的直观分组。My.Application 下的各个节点包括
Info(应用程序的版权、标题及描述等)、OpenForms(项目中当前打开的所有窗体的集合)、Log(与 System.Diagnostics
类集成的、功能丰富且具有高可配置性的日志记录工具)等。

通过使用 My.Application.Log 类,记录异常情况会比想像中轻松。当开发人员能够编写出类似以下的代码时,那他就是真正的代码强人:

Dim winINIFile As String
Try
winINIFile = My.Computer.FileSystem.ReadAllText("c:\windows\wind.ini")
Catch ex As IO.FileNotFoundException
My.Application.Log.WriteException(ex, TraceEventType.Error,
"访问 INI 文件时出错")
End Try

在与 Visual Basic 6.0 及其早期版本的用户讨论之后,所得出的较常见功能要求之一便是添加 OpenForms 集合。此功能可以通过
Visual Basic 6.0 中的关键字 Forms
实现,它为您提供了一个简单的方法来遍历应用程序中所有当前打开的窗体,而不用费力地维护您自己的全局列表,如下所示:

For Each f As Form In My.Application.OpenForms
Debug.WriteLine(f.Text)
f.WindowState = FormWindowState.Minimized
Next

My.Computer 和 My.User

使用 My.Computer 可以找到与主机相关的服务和数据。对于此类中的功能,可以单独写一篇文章,但在此处只介绍其中一些突出特点。

FileSystem 类提供一个非常简单的 API 用于处理和查询文件,这应该可以打消大家长期以来渴望使用 FileSystemObject
库的念头。以下代码使用 FileSystem 类将当前用户的“My Pictures”文件夹中的所有图片复制到一个新文件夹 (C:\Desktop
Wallpaper) 中,如果文件复制过程要花较长一段时间,则会显示一个进度栏:

Dim myPics As String = _
My.Computer.FileSystem.SpecialDirectories.MyPictures
My.Computer.FileSystem.CopyDirectory( _
myPics, "C:\Desktop Wallpaper", _
FileIO.UIOption.AllDialogs, _
FileIO.UICancelOption.DoNothing)
MessageBox.Show(My.Computer.FileSystem.GetFiles( _
myPics, FileIO.SearchOption.SearchAllSubDirectories, _
"*.jpg", "*.bmp").Count)

在 .NET Framework 1.1 中完成相同的文件复制操作时所需代码要长得多(请参阅图 1),而且不包括显示进度对话框的功能(您需要自己创建)。

My.Computer.Ports 可将读取和写入串行端口转变成一个简单的过程。这是使用当前版本的 .NET Framework
时最常见且最难执行的任务之一。以前曾用一整篇文章介绍与以下所示代码段功能相同的代码!(请参阅 Serial Comm: Use P/Invoke to Develop a .NET Base Class Library for
Serial Device Communications [英文]。)

Dim comport As IO.Ports.SerialPort
comport = My.Computer.Ports.OpenSerialPort("COM1")
AddHandler comport.ReceivedEvent, AddressOf DataReceived

通过 My.Computer.Audio 类可以播放用户定义的声音或系统声音,从而不必再使用 P/Invoking the PlaySound
API,如以下代码中所示:

Dim musicFile As String
musicFile = My.Computer.FileSystem. _
GetFiles("C:\WINDOWS\Media", _
FileIO.SearchOption.SearchAllSubDirectories, _
"*.wav")(0)
My.Computer.Audio.Play(musicFile)

通过 My.Computer.Network 可以轻松进行各种网络调用,包括与远程计算机之间传送
Ping、上载或下载文件、确定当前是否连接等功能:

If My.Computer.Network.IsAvailable Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("站点可用")
My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
System.IO.Path.Combine( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
"articles.html"))
End If
End If

还有很多类,在此不再一一介绍,这些类包括 My.Computer.Keyboard、My.Computer.Registry 和
My.Computer.Screen。希望您亲自去详细了解这些类。

My.User 是 My
中最简单的类之一,但不要被它的简单外表所迷惑;通过它可以访问很多有关应用程序的当前用户的有用信息。其中包括查询角色成员身份的方法和状态函数(如
IsAuthenticated):

If My.User.IsAuthenticated Then
If My.User.IsInRole("BUILTIN\Administrators") Then
MsgBox("tsk, tsk... 我们以 Admin 身份运行吗?")
End If
End If

请注意,默认情况下,My.User 属性和方法使用 Windows
验证,但它们也将与自定义安全结构无缝地配合使用,从而使编码模式保持相同,而不管您使用的是哪种类型的验证。

处理您项目中的设置、资源等内容

在 My 中,面向项目的类包括 Settings、Resources、WebServices 和 Forms。前两个类用于处理项目的关联数据,而名为
Forms 和 WebServices 的类用于直接访问已添加到项目中的窗体和 Web 服务。

使用 Visual Studio® 2005 的 IDE,可以为应用程序建立各种资源元素和强类型化的用户组或应用程序级别的设置(通过图 2
中所示设计器界面)。

2 设置设计器

在两种情况下,都必须在相应类通过 My 实现之前配置设置或资源,但将它们添加到项目中之后,My.Settings 和 My.Resources
类(分别)使您可以轻松与其中任一类型的信息进行交互。以下例程先检索和修改存储用户设置的值,再使用 My.Resources 类检索已本地化的字符串(使用图 3
中显示的 IDE 工具创建)以用于消息框中:

Dim lastRun As Date My.Settings.LastRun
My.Settings.LastRun = Now()
Dim myMessage As String = _
String.Format(My.Resources.LastRunMessage, _
lastRun.ToShortDateString)
MsgBox(myMessage)

3 资源编辑

除了刚刚介绍的两个方面之外,项目中的所有窗体都可通过 My.Forms 获得,并且在项目中引用的任何 Web 服务都可以通过 My.WebServices
类提供。对于 Web 服务,这意味着您可以选择直接引用它们,而不用手动创建实例。因此,将引用添加到来自 webservicex.net 的
WeatherForecast 服务之后,可以使用以下代码来检索当前温度:

Dim tempService As New net.webservicex.www.WeatherForecast()Dim wf As
net.webservicex.www.WeatherForecastswf =
tempService.GetWeatherByZipCode(“98052”)MsgBox(wf.ToString())

可以表示为以下更简单的代码:

MsgBox(My.WebServices.WeatherForecast.GetWeatherByZipCode("98052").ToString())

My.Forms 与我以前介绍的 My.Application.OpenForms 集合不同,因为 My.Forms 提供每个 Form
类的默认实例,而不是那些类的当前公开实例。如果您曾使用过 Visual Basic 6.0
或早期版本进行编程,那么这些默认实例对您来说绝对有用,因为通过它们可以直接使用 Form 的类名来显示、隐藏或访问窗体:

Private Sub showForm2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles showForm2.Click
My.Forms.Form2.Show()
End Sub
Private Sub updateForm2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles updateForm2.Click
My.Forms.Form2.Text = "已更新..."
End Sub

这是在发布 .NET Framework 之前 Visual Basic 中的标准行为,并且对于熟悉 Visual Basic 6.0
编程风格的开发人员来说,此次回归很受欢迎。

结论

Visual Basic 2005 中的 My 命名空间提供了快捷易用的方法来访问 .NET Framework
中某些更深层的功能,而不会妨碍您以自己选择的任一方式来直接使用 Framework。除了提供 Framework 功能之外,My 的某些方面(例如 Forms
集合)还重新引入了早期版本的 Visual Basic 中常用和方便的编程概念。在 Visual Studio 2005 和 Visual Basic 2005
Express 中试试它吧,相信您会发现它很有帮助。

Duncan Mackenzie 是 MSDN Online 的 Visual Basic 和 C# 内容策略专家,MSDN 的 Coding 4 Fun
专栏的作者,曾撰写了大量有关 Visual Basic 和 .NET 的书籍和文章。可以通过访问
http://www.duncanmackenzie.net/ 与 Duncan 联系。

本文摘自 MSDN Magazine 的 Visual Studio 2005 指导教程一期。

最新电影,电视剧,尽在午夜剧场

电影电视剧午夜不寂寞