** Visual Basic .NET 中动态加载类 **
· ··Microsoft
摘要: 理想情况下,编写软件系统之前我们就应该知道此软件系统需要完成哪些操作。但实际情况并非如此,因此我们的系统应该是可以调整的。
最能体现这种适应性的是动态集成新功能的能力。例如,在 Windows 窗体应用程序中,这种能力是指加载编译原始应用绦蚝芫靡院蟠唇ǖ拇疤宓哪芰Α?/P>
这种操作在 Microsoft Visual Basic® 6.0 中几乎是不可能的,但是在 Visual Basic .NET 中却相当容易。利用 System.Reflection 命名空间的功能,程序只需知道程序集的位置即可请求动态加载该程序集。然后即可加载该程序集中的类并对类进行实例化。由于 Windows 窗体也是一种类,这就意味着可以动态地加载、显示和使用窗体,即使在编译原始程序时窗体并不存在。
典型的方案
假设我们有一个多文档界面 (MDI) 应用程序,需要具有将任意窗体加载为子窗体的能力。那么应用程序应该能够执行以下操作:
- 获取可以加载的窗体的列表,通常不在 .NET 配置文件中。
- 显示该列表并允许用户从中选择一个窗体。
- 实例化并显示用户选择的窗体。
让我们编写这样一个应用程序,看看如何完成动态加载。
步骤 1:创建项目和 MDI 窗体
启动一个新的 Windows 窗体项目。将其命名为 FormsOnTheFly。在新项目中包含的空窗体 Form1 中,将它的 IsMdiContainer 属性更改为 True 。这样,该窗体即变成一个 MDI 父窗体。更改窗体的大小,使窗体的长和宽的尺寸大约为默认值的两倍。
将一个面板控件拖动到窗体上,然后设置它的 Dock 属性,使它靠接在窗体的顶部。更改面板的大小,使它的高度大约为 0.5 英寸。
将一个组合框拖动到面板上。将它命名为 cboForms,然后将它的 DropDownStyle 设置为 DropDownList 。
最后,将一个按钮拖动到面板上。将它命名为 btnLoadForm,然后将它的 Text 属性设置为 Load Form 。
此时,Form1 应如图 1 所示。
图 1:添加所有控件后处于设计模式下的 MDI 窗体
步骤 2:生成一个类,以存放可用窗体的数据
我们将获取可能从基于 XML 的配置文件之外加载的窗体的有关信息。但是,为了更便于在组合框中显示可用窗体并获取有关所选窗体的信息,还应建立一个对象集合。集合中的每个对象都将存放一个可用窗体的信息。对象应具有以下属性:
- Description :显示在组合框中的窗体说明。
- Location :窗体所在的 DLL 的文件名。
- Type :窗体的 .NET 类型的名称(例如,MyProject.Form1)。
这样的集合可以数据绑定到列表框中。要从列表框中返回对所选对象的引用,还需要一个属性,我们称之为 Reference 。
要创建类,请选择 Project | Add Class (项目|添加类),然后将类命名为 DynamicClass.vb。在类中添加以下代码:
| Public Class DynamicClass
Dim msLocation As String
Dim msType As String
Dim msDescription As String
Public Sub New(ByVal sLocation As String, _
ByVal sDescription As String, _
ByVal sType As String)
Me.Location = sLocation
Me.Description = sDescription
Me.Type = sType
End Sub
Public Property Location() As String
Get
Return msLocation
End Get
Set(ByVal Value As String)
msLocation = Value
End Set
End Property
Public Property Type() As String
Get
Return msType
End Get
Set(ByVal Value As String)
msType = Value
End Set
End Property
Public Property Description() As String
Get
Return msDescription
End Get
Set(ByVal Value As String)
msDescription = Value
End Set
End Property
Public ReadOnly Property Reference() As Object
Get
Return Me
End Get
End Property
End Class