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