首页 > 编程 > .NET > 正文

Visual Basic .NET 中动态加载类 (二)

2024-07-10 12:59:10
字体:
来源:转载
供稿:网友
microsoft
步骤 3:创建配置文件以存放可用窗体

  应用程序在运行时需要的某些信息可能在编译时无法提供,这些信息通常放置在配置文件中。在 visual basic 6.0 中,配置文件应该是 ini 文件或 windows 注册表。而在 .net 中,则使用基于 xml 的配置文件。

  我们无法详细介绍配置文件,因为这个主题非常复杂。但是,您应该知道,windows 窗体应用程序的配置文件与应用程序的 exe 启动文件在同一个目录中。配置文件的名称与程序的 exe 启动文件的名称相同,只不过在 exe 文件名后添加了后缀 .config。这就是说,如果执行 myapp.exe 程序可启动我的应用程序,则配置文件的名称一定是 myapp.exe.config,而且配置文件必须与 myapp.exe 位于同一个目录中。

  以下是示例中要使用的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configsections>
<section name="availableclasses" type="system.configuration.namevaluesectionhandler" />
</configsections>
<availableclasses>
<add key="placeholder – do not load"
value="dllpathnamegoeshere~nameoftypegoeshere"></add>
</availableclasses>
</configuration>

  此处,<availableclasses> 标记是占位符信息,便于人们看清格式。稍后,我们还会再返回来,为创建的新窗体添加配置信息。

  这实际上并不是存放窗体配置信息的理想方式,因为我们用符号分隔的方式在同一位置保存 dll 位置和类型名称。但是,使用高级方法分别存放这些信息会要求相当多的注释和代码,所以我们暂且使用这种替代方法。

  使用某些文本编辑器或 xml 编辑器(或 microsoft visual studio®)创建上述配置文件,然后使用 formsonthefly.exe.config 文件名将其保存在 formsonthefly 项目的 /bin 目录下。因为 .net 配置类使用区分大小写的 xml 标记,所以创建此文件时,请注意 xml 标记中字母的大小写。

  步骤 4:将配置信息读入集合中
  我们为窗体编写的代码将使用 system.configuration 和 system.reflection 命名空间中的类。请将以下两行代码置于 form1 代码的最顶端,以便更方便地访问这些类:

  imports system.configuration
  imports system.reflection
  还需要一个模块级变量来存放配置信息集合。请将以下代码行紧挨着 inherits system.windows.forms.form 代码行放在其下方:

  dim colavailableclasses as arraylist
现在,可以编写核心代码了。在 form1 的 form load 事件中放置以下代码,以便读取配置文件、创建存放信息的对象集合以及将集合数据绑定到组合框:

' 实例化配置信息集合。
colavailableclasses = new arraylist()
' 获取要从配置文件中加载的可用项。
dim classconfigvalues as specialized.namevaluecollection
classconfigvalues = ctype(configurationsettings.getconfig("availableclasses"), _
specialized.namevaluecollection)

dim iindex as integer
dim slocation as string
dim sdescription as string
dim stype as string
dim svalue as string

' 创建可绑定到组合框的可用项的
' 集合。
for iindex = 0 to classconfigvalues.count - 1
sdescription = classconfigvalues.keys(iindex)
svalue = classconfigvalues.item(sdescription)

' 经过简单的处理,从一个字段中
' 获取位置和类型。
dim ipos as integer
ipos = instr(svalue, "~")
slocation = microsoft.visualbasic.left(svalue, ipos - 1)
stype = microsoft.visualbasic.right(svalue, len(svalue) - ipos)

dim objnewform as new dynamicclass(slocation, sdescription, stype)
colavailableclasses.add(objnewform)
next

' 现在,将集合绑定到组合框。
' 显示说明,并返回对象的引用。
cboforms.datasource = colavailableclasses
cboforms.displaymember = "description"
cboforms.valuemember = "reference"


  步骤 5:插入逻辑以加载所选窗体   
现在,在 btnloadform 的 click 事件中放置以下逻辑:

dim objformtoload as dynamicclass
objformtoload = cboforms.selectedvalue
dim asmassemblycontainingform as [assembly] = _
[assembly].loadfrom(objformtoload.location)
dim typetoload as type = asmassemblycontainingform.gettype(objformtoload.type)
dim genericinstance as object
genericinstance = activator.createinstance(typetoload)

dim formtoshow as form = ctype(genericinstance, form)
formtoshow.mdiparent = me
formtoshow.show()


  这是程序的核心部分。通过使用集合中一个对象的信息实例化代码并显示窗体。让我们逐行说明这段代码。

  首先我们引用了其中包含要加载窗体的位置和类型的对象 (objformtoload)。它被设置为组合框的 selectedvalue 属性,在从数据绑定的组合框返回所选内容时使用。

  dll 的位置包含在对象的 location 属性中。assembly 类的 loadform 方法使用该属性创建对程序集的引用。(将 assembly 类置于括号中是因为 assembly 是 .net 关键字。括号将通知编译器,其中的内容不是正在使用的关键字,而是类名。)

  下面,我们需要引用正在加载的 .net 类型(类)。可以使用程序集的 gettype 方法,通过传递存放类型名称(该类型名称将从存放配置数据的对象的 type 属性中获取)的字符串进行引用。对类型的引用保存在 typetoload 中。

  reflection 类和 activator 类使用它们的 createinstance 方法创建类型的实例。(createinstance 与 visual basic 6.0 中的 createobject 类似。)但是,实例必须是类型对象,因为该类型要动态加载。

  最后,新实例化的对象(实际上是一个窗体)必须转换为正确的类型才能启用前期绑定。我们知道它是一个窗体,所以可以使用 ctype 函数将其转换为窗体。

  最后,将新窗体设置为 mdi 父窗体的子窗体并对其进行显示。

注意:从 death of the browser?(英文)所示的 url 处加载的程序集被复制到本地缓存中。从 unc 加载的程序集(如本文中的程序集)仅在当前位置使用,不被复制到任何缓存中。
  步骤 6:编译应用程序   
  现在,我们可以编译应用程序,但由于尚未创建任何窗体,所以不会显示任何窗体。可以编译并运行程序,确保它能够工作并确保组合框能够正确加载占位符项。如果单击 btnloadform,则会显示错误信息或教程,因为配置文件中的信息还未指向任何对象。

  步骤 7:创建要显示的窗体   
现在,开始创建名为 firstform 的新的 windows 窗体应用程序。在出现的空白 form1 上放置一些控件 - 控件类型不限。

  然后在 solution explorer(解决方案资源管理器)中的 firstforms 项目上单击鼠标右键,选择 properties(属性)。在 output type(输出类型)组合框中选择 class library(类库)。如果未看到组合框,可以在 solution explorer(解决方案资源管理器)的 solution(解决方案),而不是 project(项目)上单击鼠标右键。

  现在开始创建项目。即创建一个包含该窗体的 dll。

  创建一个名为 c:/newforms 的目录。将 firstforms.dll 从 firstforms 的 /bin 目录复制到 c:/newforms 中。

  对名为 secondform 和 thirdform 的项目重复上述操作。在每个窗体中拖入不同的控件以便于区分。也可以将每个窗体的背景色更改为独特的颜色。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表