基于组件的.NET软件开发(4)

设计示例用到的组件
创建两个VB.NET类库工程:DynamicComponent和VBDynamicComponent2,分别创建两个窗体VBForm1和VBForm2(如图6图7所示),前者放在DynamicComponent工程中,后者放在VBDynamicComponent2工程中。

分别编译生成两个DLL文件:DynamicComponent.dll和VBDynamicComponent2.dll。

接着,我们创建一个Windows应用程序VBTestDynamicComponent用于测试我们的组件装配技术。

读取XML配置文件
在测试程序启动时,它从XML配置文件中读取信息,我们看到,相关信息可以分为两类:一类是要装入的DLL文件清单,另一类是需要装入的类名。这两者是一一对应的,所以,我们可以创建两个ArrayList,一个用于存放文件名,一个用于存放类名,然后,用一个类MyComponentList把这两个ArrayList给封装起来,外部使用者只需给出索引,就可以马上同时得到文件名与类名。

类的接口设计如下:

图 9 用于实现动态装入组件的类

参见图9,只要给MyComponentList类的对象指定一个XML配置文件名,再调用beginRead(),调用者就可以通过索引(0,1,2……)来获取文件名和类名。

读取XML格式数据可以使用.NET framework所提供的XmlTextReader类。完整代码如下:

'从XML配置文件中读取组件的类名与文件名

Imports System.Collections.Specialized

Imports System.Windows.Forms

Public Class MyComponentList

Private xmlreader As Xml.XmlTextReader

Private _FileName As String 'XML配置文件名

Private _ComponentFileName As String '组件库文件名

Private _ComponentName As String '组件库中的类名

Private componentNames As ArrayList '存放配置文件中列出的所有组件类名

Private componentFiles As ArrayList '存放配置文件中列出的所有组件库名

'在构造函数中创建相关对象

Public Sub New(ByVal FileName As String)

_FileName = FileName

_ComponentFileName = ""

_ComponentName = ""

componentNames = New ArrayList()

componentFiles = New ArrayList()

xmlreader = New Xml.XmlTextReader(FileName)

End Sub

'XML配置文件名

Public Property FileName() As String

Get

Return _FileName

End Get

Set(ByVal Value As String)

'文件名空则应抛出异常.

_FileName = Value

End Set

End Property

'读取组件库

Public Sub beginRead()

Dim b1, b2 As Boolean

b1 = False

b2 = False

'以下循环读入文件,使用标记b1和b2来实现“组件库文件ß à组件名”的配对,

'并分别存入对应的两个ArrayList中(componentFiles ß àcomponentNames)

While xmlreader.Read

If xmlreader.Name = "Component" Then

xmlreader.MoveToFirstAttribute()

If xmlreader.Name = "ComponentName" Then

_ComponentName = xmlreader.Value

b1 = True

End If

If xmlreader.Name = "ComponentFileName" Then

_ComponentFileName = xmlreader.Value

b2 = True

End If

While xmlreader.MoveToNextAttribute()

If xmlreader.Name = "ComponentName" Then

_ComponentName = xmlreader.Value()

b1 = True

End If

If xmlreader.Name = "ComponentFileName" Then

_ComponentFileName = xmlreader.Value()

b2 = True

End If

If b1 And b2 Then

componentNames.Add(_ComponentName)

componentFiles.Add(_ComponentFileName)

b1 = False

b2 = False

End If

End While

End If

End While

End Sub

'取出指定索引的文件名(即组件库文件名)

Public Function getfilename(ByVal index As Integer) As String

Return componentFiles.Item(index)

End Function

'取出指定索引的类名(即组件名)

Public Function getClassName(ByVal index As Integer) As String

Return componentNames.Item(index)

End Function

End Class

这些代码非常清晰,就不多废话了。

动态创建对象
知道了需要装入的组件,下一步就是如何创建对象了,这需要用到System.Reflection中的类。

同样地,我们也设计一个类LoadComponent用于封装创建对象的功能:

图 10 完成创建组件对象的类

这个类的使用非常简单,给定一个DLL文件名,LoadComponentLibrary()函数用于将此DLL装入内存,之后,便可使用LoadClass创建指定类的对象。

现在我们来逐步分析一下这个类。

(1)装入组件库:

首先必须了解,在.NET中把可以复用的组件库称为“Assembly”,一般译为“程序集”(在上文中所提到的组件库,其实就是指程序集),大多数情况下,每个.NET DLL都是一个程序集。而可以复用的类就放在程序集中。为此,要动态根据类的名字来创建对象,就必须首先把程序集装入内存。在.NET中,可以通过反射技术来实现这一点。示例代码如下:

Private myDll As System.Reflection.Assembly

Public Function LoadComponentLibrary(ByVal ComponentFileName As String) As Boolean

'装入指定的组件代码库

'成功返回true

Try

myDll = System.Reflection.Assembly.LoadFrom(ComponentFileName)

If myDll Is Nothing Then

MessageBox.Show("Can't Load library")

Return False

End If

Catch Errobj As SystemException

MessageBox.Show(Errobj.Message)

Return False

End Try

Return True

End Function

(2)创建对象:

一旦程序集被装入内存,我们就可以根据类名字串来创建对象了,如下所示:

Private obj As Object

Public Function LoadClass(ByVal classname As String) As Object

If myDll Is Nothing Then

Return Nothing

End If

Try

obj = myDll.CreateInstance(classname)

Catch Errobj As SystemException

MessageBox.Show(Errobj.Message)

Return Nothing

End Try

Return obj

End Function

有了LoadComponent类,我们以后要做的事就简单多了。

时间: 2024-10-31 01:21:33

基于组件的.NET软件开发(4)的相关文章

基于组件的.NET软件开发(1)

基于组件的.NET软件开发 前言 随着软件技术的飞速进步,现代的大型软件都广泛采用了基于软件组件的开发方式.以成熟的CBD(Component Based Design:基于组件的系统设计)理论为指导,在对系统的分析与设计完成之后,系统开发体现为复用已有组件.开发新组件以及将所有组件装配起来的过程.J2EE大规模地使用各种组件构照复杂的企业信息系统,获得了巨大的成功. 作为后来者,.NET framework汲取了J2EE的成功经验,在组件化开发方面有着自己独到的设计,在本文中,我们将介绍.NE

基于组件的.NET软件开发(1)

  基于组件的.NET软件开发   前言     随着软件技术的飞速进步,现代的大型软件都广泛采用了基于软件组件的开发方式.以成熟的CBD(Component Based Design:基于组件的系统设计)理论为指导,在对系统的分析与设计完成之后,系统开发体现为复用已有组件.开发新组件以及将所有组件装配起来的过程.J2EE大规模地使用各种组件构照复杂的企业信息系统,获得了巨大的成功.     作为后来者,.NET framework汲取了J2EE的成功经验,在组件化开发方面有着自己独到的设计,在

基于组件的.NET软件开发(2)

组件的继承 前面实现的将C#组件组合进VB工程中只是牛刀小试,现在我们来实现混合语言的面向对象编程(OOP),首先,我们来尝试一下混合语言组件的继承. 新建一个VB类库工程VBComponent,在工程中按上面的方法添加对CSharpClass.dll组件的引用,然后组件中增加一个新类:ExtendsFromCSharp,它继承自C#类CSharpClass,ExtendsFromCSharp类提供一个Add(x,y)方法,将两数相加,用UML表示如图4: 图 4 从C#类继承而来的VB类 具体

基于组件的.NET软件开发(5)

实战: 创建一个VB.NET Windows应用程序:VBTestDynamicComponent.将前面介绍的两个类ComponentList和LoadComponent加入到工程中. 我们在程序启动时从配置文件中读入相关的程序集信息和类名信息,为此在主窗体的Form_Load过程中添加以下代码: 01 Private objLoadComponent As LoadComponent 02 Private VBObj As Object 03 Private ComponentReader

基于组件的.NET软件开发(3)

动态组件插拔 在实现动态组件插拔之前,我们必须了解一个概念:反射(Reflection). 所谓反射,就是仅依据名字来创建一个对象. 举个例子,在上面的例子中,我可以直接给定一个字串:" CSharpClassNameSpace.CSharpRect",然后我就可以生成这个对象,并调用它的Area()方法求面积!其前提条件是程序能访问存放这些类的DLL文件. 好了,现在可以说说我们的构想了: 我们把某个程序要用到的DLL和其中的类名放在一个配置文件中,程序启动时读取这个文件,就可以自动

基于虚拟化技术的软件开发构成云应用根本

本文讲的是基于虚拟化技术的软件开发构成云应用根本,[IT168 资讯]计算技术的发展,体现出计算普适化与网络泛在化的特点.云计算模式,通过泛在的高速网络,将轻小的客户端系统与高性能服务器结合起来,为用户提供前所未有的功能与便利.新的计算模式对系统软件提出了许多新的挑战:如何在高性能多核服务器上高效.安全地运行多种网络应用?如何支持数以亿计的并发用户访问?如何在智能手机和上网本这些轻小的设备上获得多种多样的网络服务?如何让开发者方便地开发云计算模式下的应用程序.... 为了解决上述挑战,学术界和工

使用基于模型的测试工作流进行与安全相关的软件开发

安全相关软件的挑战 嵌入式软件已经逐渐成为当今创新型产品的核心.对于在我们日常生活 中必不可少的产品来说,嵌入式软件是定义其功能,控制其电气和机械系统的重要组件.例如,在飞机 .汽车.火车或医疗设备中,故障可能会导致人身伤亡.此时必须倍加谨慎,也需要付出额外的努力, 确保系统安全运作,保证用户的安全,避免代价高昂的产品召回. 对于极度注重安全的代码, 企业必须遵循严格的开发标准和指导准则,例如针对商业航空电子设备的 DO-178C 和 DO-178B:针对 汽车的 ISO 26262:针对医疗设

Struts和Tiles辅助基于组件的开发

将视图组合在一起以便于构造 Web 应用程序 "模型-视图-控制器(Model-View-Controller,MVC)"框架对于生成有组织的模块化应用程序(这 些应用程序能够清晰地划分逻辑.样式和数据),是一种经证实的和方便的方法.在 Java 世界中, Struts 是最著名的也是最常被谈及的 MVC 的开放源码体现之一.致力于 Struts 的开发人员最近增强了 该项目的核心功能,并改进了视图支持(合并了 Tiles 视图组件框架来加强对基于组件开发的支持), 以便增加可重用性并

基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET 4.0 简介

介绍       AgileEAS.NET应用开发平台,简称EAS.NET,是基于敏捷并行开发思想以及.NET构件技术而开发的一个应用系统快速开发平台,用于帮助中小型软件企业建立一条适合快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的,AgileEAS.NET应用开发平台包含基础类库.资源管理平台.运行容器.开发辅助工具等四大部分,资源管理平台为敏捷并行开发提供了设计.实现.测试等开发过程的并行,基于AgileEAS.NET平台的应用系统的各个业务功能子系统,在系统体