DotNet · 2022年5月2日

利用“My”定位 .NET 框架和项目

利用“My”定位 .NET 框架和项目

发布日期: 11/12/2004 | 更新日期:
11/12/2004

Duncan Mackenzie

本文基于 Microsoft Visual Studio 2005,(此前代号为“Whidbey”)的预发布版。文中包含的所有信息均有可能变更。

本文讨论:

·

Visual Studio 2005 中的Visual Basic

·

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

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

代码下载:
VB2005.exe(134KB)

*

我在着手编写这篇有关 Visual Basic ? 2005
的文章时,发现可供选择的主题真是太多了。我要先大概地看看这个完整的功能列表,然后为你提供一些有关很酷的 IDE
功能(例如,“编辑并继续”操作、IntelliSense?代码片段或异常助理)的信息;简要介绍高级语言增强功能,例如泛型、部分类和无符号类型;并且粗略介绍一下所有很酷的
Microsoft?.NET 框架增强功能,包括 Windows?窗体、数据绑定、ClickOnce 部署等。虽然这些都是很有趣的功能,但我要深入讨论
Visual Basic 2005 的一个最酷的功能:那就是被称为 My 的命名空间。

为什么要讨论 My?

程序员遇到的一个最大问题是 .NET
涉及的内容实在太多了,这意味着为特定任务查找最佳的类是件很困难的事。我阅读了开发人员张贴的很多新闻组贴子,发现他们认为从 Visual Basic .NET 或
C# 代码调用 Win32? API 函数很困难,而在 .NET 中已经存在了功能完全一样的函数。那么,他们为什么要调用 API
呢?因为他们没有发现、注意到这些函数,或者还不了解如何使用框架的现有内容。My 提供了直观的定位层次结构,该定位层次结构通过易于理解的根对象公开现有的 .NET
功能,主要面向您通常要处理的实际任务和概念。

这听起来很不错,但这意味着什么呢?要快速说明 My 的好处,请考虑一个在 GotDotNet
论坛上非常常见的问题:“如何将文本文件的完整内容读取到字符串中?”.NET 框架 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
框架的速查表是最贴切的。这类简化使查找和执行正确操作更加容易,在编程中是一种常见的做法。在遇到可供我或者我的开发团队重复使用的多步过程时,我通常会创建一个帮助器函数。帮助器函数通常只是个简单调用,它获取最常用的参数,然后隐蔽地执行多步过程,从而使开发过程更顺利。大多数软件开发商都会生成这样的帮助器函数,很常见的做法是将它们分组组合到某些代码片段集中或共享库形式中,例如
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
框架或当前项目的元素。My.Application、My.Computer 和 My.User 都与框架功能有关,而
My.Forms、My.Resources、My.Settings 和 My.WebServices
都处理当前项目的内容。在我逐一介绍这些类时(首先介绍主要与底层框架有关的类),我将提供一些快速示例,以及这些示例所包含的属性和类的相关信息。

我在前面已经提到,使用 .NET
框架时,有时很难找到您需要的确切功能,但找到它并不是您需要了解的唯一问题。在某些特定环境中,甚至在已经找到需要的类之后,使之准备就绪所需的具体步骤和构造函数参数还要占用几行代码,并且难以理解。与框架有关的
My 类(My.Application、My.Computer 和
My.User)设计用于帮助您直接定位到所需的类,并且对它进行相应设置,以便您可以开始工作。

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

使用 My.Application.Log
类记录异常将比想象的要容易得多。当开发人员能够编写类似下面这样的代码时,他们将感觉自己是真正的代码编写高手:

Dim winINIFile As String

Try
    winINIFile = My.Computer.FileSystem.ReadText("c:\windows\wind.ini")
Catch ex As IO.FileNotFoundException
    My.Application.Log.WriteException(ex, "Error Accessing INI File")
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.SpecialFolders.MyPictures.Path

My.Computer.FileSystem.CopyFolderContents( _
    "C:\Desktop Wallpaper", myPics, False, True)

MsgBox( My.Computer.FileSystem.GetFiles( _
    myPics, "*.jpg", "*.bmp").Count)

与之相比,在 .NET 框架 1.1 中完成相同的文件复制将需要更多的代码(请参阅
1
),并且没有显示进度对话框的功能,需要您自己创建。
My.Computer.Ports(Visual Studio? 2005 PDC
预览版没有该功能)使得对串行端口的读取和写入变成一个简单的过程。这是使用当前版本的 .NET
框架时最常见同时也是最难执行的任务之一。这里显示的代码片段以前要占用相当长的篇幅才能生成!(请参阅 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 类用于播放用户定义的声音或系统声音,从而无需再对 PlaySound API 进行平台调用
(P/Invoke),如下所示:

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

My.Computer.Network 使多种网络调用更容易使用,其中包括接收和发送与远程机器的 Ping
操作、上载或下载文件、确定当前是否处于连接状态,以及其他许多功能。

If My.Computer.Network.IsConnected Then
    If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
        Debug.WriteLine("Site Available")

        My.Computer.Network.DownloadFile( _
            "http://www.duncanmackenzie.net/Articles/", _
            My.Computer.FileSystem.SpecialFolders.MyDocuments, _
            ShowProgress:=True)
    End If
End If

My.Computer.Printer 与 Windows Forms 命名空间中新的 Printing
类一起使用,使打印变得很容易。作为示例,可以使用那些具有 GDI+ 编程经验的人所熟悉的代码来创建如图 2 中所显示的报表的产生过程。下面是前几行代码:

With My.Computer.Printers.DefaultPrinter
    .HorizontalAlignment = HorizontalAlignment.Center
    .WriteLine("Document Title")
    .WriteImage(New Bitmap("z:\msdn-logo.gif"))
    .HorizontalAlignment = HorizontalAlignment.Left
    .Write("Company Name")
    .HorizontalAlignment = HorizontalAlignment.Right
    .WriteLine("Report Title")
    .WriteHorizontalLine(0.05)
    .WriteLine()
    ...

如果您想知道使用 1.1 版本的框架产生相同类型的报表时要涉及哪些事项,可以参考我在 MSDN? Online 上发表的关于打印的文章,链接是Printing Reports in Windows Forms。

MAissues0405NETFramework20fig02

图 2 使用 My 创建报表

还有不少其他的类,我甚至没有时间介绍了,包括 My.Computer.Keyboard、My.Computer.Registry 和
My.Computer.Screen。我建议您自己去研究它们。

很多功能都是通过 My 的 My.Computer 部分公开的,以至于每次 Visual Studio 2005 的新测试版和 Community
Drop 版发布时,它的对象模型都成为我要首先查看的文档内容。

My.User 是 My 中最简单的类之一,但不要让它的简单性欺骗了您;它使您能够访问与应用程序的当前用户有关的很多有用信息。该信息包括诸如
DisplayName、UserName 和 DomainName 这样的属性,以及用于查询角色成员身份的方法和像 IsAuthenticated
这样的状态函数:

If My.User.IsAuthenticated Then
    If My.User.IsInRole("BUILTIN\Administrators") Then
        MsgBox("tsk, tsk... running as Admin are we?")
    End If
End If

请注意,默认情况下,My.User 属性和方法使用 Windows
身份验证,但它们也将与自定义安全基础结构无缝地配合工作,这样,不管您使用何种身份验证类型,都能保持编码模型相同。

公开项目的 Settings、Resources 和其他内容
在 My 中,与项目有关的类包括
Settings、Resources、WebServices 和 Forms。前两个类处理项目的关联数据,而命名清晰的 Forms 和 WebServices
类则用于直接访问已经添加到项目中的窗体和 Web 服务。

MAissues0405NETFramework20fig03

图 3 设置设计器

通过 Visual Studio 2005 的 IDE 进行工作时,您可以为应用程序设置多种资源元素和一组强类型的用户级或应用程序级设置(通过图 3
显示的设计器界面)。

MAissues0405NETFramework20fig04

图 4 资源编辑

在这两种情况中,都必须在相应的类通过 My 变为可用之前配置设置或资源,但是在将它们添加到项目中之后,My.Resources 和 My.Settings
类将(分别)使您很容易与这两类信息中的任意一种进行交互。下面的例程检索并修改存储的用户设置值,然后使用 My.Resources
类来检索将在消息框中使用的本地化字符串(它是使用图 4 中显示的 IDE 工具创建的):

Dim lastRun As Date
lastRun = My.Settings.LastRun
My.Settings.LastRun = Now()

Dim myMessage As String = _
    String.Format(My.Resources.LastRunMessage, _
    lastRun.ToShortDateString)

MsgBox(myMessage)

除了刚才描述的两个区域之外,项目中的所有窗体通过 My.Forms 均可用,而且项目中引用的任何 Web 服务都是通过
My.WebServices 类公开的。对于 Web 服务来说,这意味着您可以选择直接引用它们,而无需手动创建实例。因此,在添加了对 xmethods.com
中的 TemperatureService 的引用之后,可以使用以下代码检索当前温度:

Dim tempService As New net.xmethods.www.TemperatureService()
MsgBox(tempService.getTemp("98052"))

上面的代码可以更简单地表达为:

MsgBox(My.WebServices.TemperatureService.getTemp("98052"))

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 = "Updated..."
End Sub

在发布 .NET 框架之前,这是 Visual Basic 中的标准行为,对于熟悉 Visual Basic 6.0
编程风格的开发人员来说,该功能的恢复颇受欢迎。

小结

Visual Basic 2005 中的 My 为访问 .NET
框架中某些更深的功能区域提供了快速、易用的方法,同时不妨碍您以自己选择的任何方式直接使用框架。除了公开框架功能以外,My 的某些区域(例如,Forms
集合)恢复了 Visual Basic 早期版本中熟悉和方便的编程概念。请用 Visual Studio 2005
的可用版本进行尝试,我确信,您会发现它是多么的有用。

Duncan Mackenzie 是 MSDN Online 有关 Visual Basic 和 C# 内容的策划人。他是 MSDN 的
Coding 4 Fun 专栏的作家,并且是有关 Visual Basic 和 .NET 的多部书籍和多篇文章的作者。要联系 Duncan,请访问 http://www.duncanmackenzie.net。

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

电影电视剧午夜不寂寞