动态组件插拔
在实现动态组件插拔之前,我们必须了解一个概念:反射( Reflection )。
所谓 反射 ,就是 仅依据名字来创建一个对象 。
举个例子,在上面的例子中,我可以直接给定一个字串:“ CSharpClassNameSpace.CSharpRect”, 然后我就可以生成这个对象,并调用它的 Area() 方法求面积!其前提条件是程序能访问存放这些类的 DLL 文件。
好了,现在可以说说我们的构想了:
我们把某个程序要用到的 DLL 和其中的类名放在一个配置文件中,程序启动时读取这个文件,就可以自动地加载外部指定的 DLL ,实现程序的组件动态装配。当我需要更换程序中的某个组件时,我只需要将新 DLL 复制到程序文件夹之下,系统就马上可以使用新的组件,而不用重新编译或修改组件调用者原有的任何代码!
现在看看我们的示例是怎么样的!
我们创建两个 VB 类库,每个类库都封装了一个窗体。 VBDynamicComponent 组件中封装了以下窗体:
图 6 组件一
VBDynamicComponent2 组件中封装了以下窗体:
图 7 组件二
主程序是一个 Windows 应用程序,它可以动态创建两个组件中的任何一个窗体对象,并显示它们:
图 8 示例程序主窗体
主程序在启动时会读取一个系统配置清单,是 XML 格式的,如下所示:
< Config >
** ** < Component ComponentName =" DynamicComponent.VBForm1 " ComponentFileName =" DynamicComponent.dll " />
** ** < Component ComponentName =" VBDynamicComponent2.VBForm2 " ComponentFileName =" VBDynamicComponent2.dll " /> 主程序根据清单装入指定的组件 DLL 文件,并依据 ComponentName 属性值创建对象,排列在第一位的组件窗体被自动显示。
大家看一看,这样一个系统组件装配清单,象不象一个厨师准备大餐时的原料清单?现在就开始制作我们的“满汉全席 ” 吧!