VisualBasic.NET中动态加载类

时间:2007-06-15 来源: 作者: 【字体: 减小 增大收藏 | 投稿
  
摘要:理想情况下,编写软件系统之前我们就应该知道此软件系统需要完成哪些操作。但实际情况并非如此,因此我们的系统应该是可以调整的。

  最能体现这种适应性的是动态集成新功能的能力。例如,在Windows窗体应用程序中,这种能力是指加载编译原始应用程序很久以后创建的窗体的能力。 财管家园,fs119.net

  这种操作在MicrosoftVisualBasic®6.0中几乎是不可能的,但是在VisualBasic.NET中却相当容易。利用System.Reflection命名空间的功能,程序只需知道程序集的位置即可请求动态加载该程序集。然后即可加载该程序集中的类并对类进行实例化。由于Windows窗体也是一种类,这就意味着可以动态地加载、显示和使用窗体,即使在编译原始程序时窗体并不存在。 财管 家园 fs119.net

  典型的方案

  假设我们有一个多文档界面(MDI)应用程序,需要具有将任意窗体加载为子窗体的能力。那么应用程序应该能够执行以下操作:

  • 获取可以加载的窗体的列表,通常不在.NET配置文件中。
  • 显示该列表并允许用户从中选择一个窗体。
  • 实例化并显示用户选择的窗体。
  •   让我们编写这样一个应用程序,看看如何完成动态加载。

    财管家园,fs119.net

      步骤1:创建项目和MDI窗体

      启动一个新的Windows窗体项目。将其命名为FormsOnTheFly。在新项目中包含的空窗体Form1中,将它的IsMdiContainer属性更改为True。这样,该窗体即变成一个MDI父窗体。更改窗体的大小,使窗体的长和宽的尺寸大约为默认值的两倍。

    财软联 盟 fs119.net

      将一个面板控件拖动到窗体上,然后设置它的Dock属性,使它靠接在窗体的顶部。更改面板的大小,使它的高度大约为0.5英寸。 财软 联盟 fs119.net

      将一个组合框拖动到面板上。将它命名为cboForms,然后将它的DropDownStyle设置为DropDownList财管,家园,fs119.net

      最后,将一个按钮拖动到面板上。将它命名为btnLoadForm,然后将它的Text属性设置为LoadForm

    财软联,盟,fs119.net

      此时,Form1应如图1所示。

    财软联盟,fs119.net

    财软联盟 fs119.net

    图1:添加所有控件后处于设计模式下的MDI窗体 财管.家园.fs119.net

      步骤2:生成一个类,以存放可用窗体的数据

      我们将获取可能从基于XML的配置文件之外加载的窗体的有关信息。但是,为了更便于在组合框中显示可用窗体并获取有关所选窗体的信息,还应建立一个对象集合。集合中的每个对象都将存放一个可用窗体的信息。对象应具有以下属性:

  • Description:显示在组合框中的窗体说明。
  • Location:窗体所在的DLL的文件名。
  • Type:窗体的.NET类型的名称(例如,MyProject.Form1)。
  •   这样的集合可以数据绑定到列表框中。要从列表框中返回对所选对象的引用,还需要一个属性,我们称之为Reference

    财管家,园,fs119.net

    财管家 园 fs119.net

    财软,联盟,fs119.net


    财管家园,fs119.net

    财软联盟 fs119.net

    财.管家园.fs119.net

      要创建类,请选择Project|AddClass(项目|添加类),然后将类命名为DynamicClass.vb。在类中添加以下代码: 财软.联盟.fs119.net

    PublicClassDynamicClass

    DimmsLocationAsString
    DimmsTypeAsString
    DimmsDescriptionAsString 财软联.盟.fs119.net

    PublicSubNew(ByValsLocationAsString,_
    ByValsDescriptionAsString,_
    ByValsTypeAsString)
    Me.Location=sLocation
    Me.Description=sDescription
    Me.Type=sType
    EndSub

    财软联.盟.fs119.net

    PublicPropertyLocation()AsString
    Get
    ReturnmsLocation
    EndGet
    Set(ByValValueAsString)
    msLocation=Value
    EndSet
    EndProperty 财软 联盟 fs119.net

    PublicPropertyType()AsString
    Get
    ReturnmsType
    EndGet
    Set(ByValValueAsString)
    msType=Value
    EndSet
    EndProperty

    财.管家园.fs119.net

    PublicPropertyDescription()AsString
    Get
    ReturnmsDescription
    EndGet
    Set(ByValValueAsString)
    msDescription=Value
    EndSet
    EndProperty 财管家 园 fs119.net

    PublicReadOnlyPropertyReference()AsObject
    Get
    ReturnMe
    EndGet
    EndProperty
    EndClass

    财.管家园.fs119.net


      步骤3:创建配置文件以存放可用窗体

      应用程序在运行时需要的某些信息可能在编译时无法提供,这些信息通常放置在配置文件中。在VisualBasic6.0中,配置文件应该是INI文件或Windows注册表。而在.NET中,则使用基于XML的配置文件。

    财管家.园.fs119.net

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

    财软 联盟 fs119.net

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

    财 管家园 fs119.net

    <?xmlversion="1.0"encoding="utf-8"?>
    <configuration>
    <configSections>
    <sectionname="availableclasses"type="System.Configuration.NameValueSectionHandler"/>
    </configSections>
    <availableclasses>
    <addkey="Placeholder–donotload"
    value="DLLPathnameGoesHere~NameOfTypeGoesHere"></add>
    </availableclasses>
    </configuration>

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

    财管家园 fs119.net

    财软联盟.fs119.net


    财软.联盟.fs119.net

    财软联 盟 fs119.net

    财,管家园,fs119.net

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

    财软联.盟.fs119.net

      使用某些文本编辑器或XML编辑器(或MicrosoftVisualStudio®)创建上述配置文件,然后使用FormsOnTheFly.exe.config文件名将其保存在FormsOnTheFly项目的\bin目录下。因为.NET配置类使用区分大小写的XML标记,所以创建此文件时,请注意XML标记中字母的大小写。 财软联.盟.fs119.net

      步骤4:将配置信息读入集合中

      我们为窗体编写的代码将使用System.ConfigurationSystem.Reflection命名空间中的类。请将以下两行代码置于Form1代码的最顶端,以便更方便地访问这些类:

    财软.联盟.fs119.net

      ImportsSystem.Configuration
      ImportsSystem.Reflection

      还需要一个模块级变量来存放配置信息集合。请将以下代码行紧挨着InheritsSystem.Windows.Forms.Form代码行放在其下方:

    财管家 园 fs119.net

      DimcolAvailableClassesAsArrayList

    现在,可以编写核心代码了。在Form1的FormLoad事件中放置以下代码,以便读取配置文件、创建存放信息的对象集合以及将集合数据绑定到组合框: 财管家园.fs119.net

    '实例化配置信息集合。
    colAvailableClasses=NewArrayList()

    '获取要从配置文件中加载的可用项。
    DimClassConfigValuesAsSpecialized.NameValueCollection
    ClassConfigValues=CType(ConfigurationSettings.GetConfig("availableclasses"),_
    Specialized.NameValueCollection)

    财软 联盟 fs119.net

    DimiIndexAsInteger
    DimsLocationAsString
    DimsDescriptionAsString
    DimsTypeAsString
    DimsValueAsString 财软 联盟 fs119.net

    '创建可绑定到组合框的可用项的
    '集合。
    ForiIndex=0ToClassConfigValues.Count-1
    sDescription=ClassConfigValues.Keys(iIndex)
    sValue=ClassConfigValues.Item(sDescription)

    财管家园,fs119.net

    '经过简单的处理,从一个字段中
    '获取位置和类型。
    DimiPosAsInteger
    iPos=InStr(sValue,"~")
    sLocation=Microsoft.VisualBasic.Left(sValue,iPos-1)
    sType=Microsoft.VisualBasic.Right(sValue,Len(sValue)-iPos) 财软联.盟.fs119.net

    DimobjNewFormAsNewDynamicClass(sLocation,sDescription,sType)
    colAvailableClasses.Add(objNewForm)
    Next 财,软联盟,fs119.net

    '现在,将集合绑定到组合框。
    '显示说明,并返回对象的引用。
    cboForms.DataSource=colAvailableClasses
    cboForms.DisplayMember="Description"
    cboForms.ValueMember="Reference" 财软联盟 fs119.net


      步骤5:插入逻辑以加载所选窗体  

    现在,在btnLoadForm的click事件中放置以下逻辑: 财管家园 fs119.net

    DimobjFormToLoadAsDynamicClass
    objFormToLoad=cboForms.SelectedValue

    DimasmAssemblyContainingFormAs[Assembly]=_
    [Assembly].LoadFrom(objFormToLoad.Location)
    DimTypeToLoadAsType=asmAssemblyContainingForm.GetType(objFormToLoad.Type)
    DimGenericInstanceAsObject
    GenericInstance=Activator.CreateInstance(TypeToLoad) 财管家园 fs119.net

    DimFormToShowAsForm=CType(GenericInstance,Form)
    FormToShow.MdiParent=Me
    FormToShow.Show()

    财软 联盟 fs119.net

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

    财软联盟,fs119.net

    财管.家园.fs119.net


    财软联盟,fs119.net

    财管家 园 fs119.net

    财管,家园,fs119.net

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

      DLL的位置包含在对象的Location属性中。Assembly类的LoadForm方法使用该属性创建对程序集的引用。(将Assembly类置于括号中是因为Assembly是.NET关键字。括号将通知编译器,其中的内容不是正在使用的关键字,而是类名。) 财.管家园.fs119.net

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

      Reflection类和Activator类使用它们的CreateInstance方法创建类型的实例。(CreateInstance与VisualBasic6.0中的CreateObject类似。)但是,实例必须是类型对象,因为该类型要动态加载。 财管 家园 fs119.net

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

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

    财软联,盟,fs119.net

    注意:从DeathoftheBrowser?(英文)所示的URL处加载的程序集被复制到本地缓存中。从UNC加载的程序集(如本文中的程序集)仅在当前位置使用,不被复制到任何缓存中。  步骤6:编译应用程序  

      现在,我们可以编译应用程序,但由于尚未创建任何窗体,所以不会显示任何窗体。可以编译并运行程序,确保它能够工作并确保组合框能够正确加载占位符项。如果单击btnLoadForm,则会显示错误信息或教程,因为配置文件中的信息还未指向任何对象。

    财管家 园 fs119.net

      步骤7:创建要显示的窗体  

    现在,开始创建名为FirstForm的新的Windows窗体应用程序。在出现的空白Form1上放置一些控件-控件类型不限。 财 管家园 fs119.net

      然后在SolutionExplorer(解决方案资源管理器)中的FirstForms项目上单击鼠标右键,选择Properties(属性)。在OutputType(输出类型)组合框中选择ClassLibrary(类库)。如果未看到组合框,可以在SolutionExplorer(解决方案资源管理器)的Solution(解决方案),而不是Project(项目)上单击鼠标右键。

    财管家园 fs119.net

      现在开始创建项目。即创建一个包含该窗体的DLL。 财软联 盟 fs119.net

      创建一个名为C:\NewForms的目录。将FirstForms.dll从FirstForms的\bin目录复制到C:\NewForms中。 财管家,园,fs119.net

      对名为SecondForm和ThirdForm的项目重复上述操作。在每个窗体中拖入不同的控件以便于区分。也可以将每个窗体的背景色更改为独特的颜色。 财管家.园.fs119.net

      步骤8:用新的窗体信息更新配置文件

    财软联盟.fs119.net

      现在,我们已经创建了一些新窗体,还需要在配置文件中引用它们。请用以下代码行替换FormsOnTheFly.exe.config中的占位符信息: 财软联盟 fs119.net

    <addkey="FirstForm"
    value="C:\NewForms\FirstForm.dll~FirstForm.Form1"></add>
    <addkey="SecondForm"
    value="C:\NewForms\SecondForm.dll~SecondForm.Form1"></add>
    <addkey="ThirdForm"
    value="C:\NewForms\ThirdForm.dll~ThirdForm.Form1"></add>

    财软,联盟,fs119.net

      如果要更改窗体的位置或名称,则需要对以上代码行进行相应修改。 财管家,园,fs119.net

      步骤9:运行FormsOnTheFly.exe并加载窗体

    财管家园.fs119.net

      现在执行FormsOnTheFly.exe(不加载VisualStudio)。选择组合框中的一个窗体,然后单击btnLoadForm。如果正确完成了所有步骤,则可以看到子窗体加载到MDI窗口中(即使编译MDI应用程序时子窗体并不存在)。

    财.管家园.fs119.net

    图2显示了动态加载窗体后的MDI窗体。

    财软 联盟 fs119.net

    财管家 园 fs119.net

    图2:动态加载窗体后的MDI窗体

    财软联盟 fs119.net

      此时,您可以根据需要创建任意多个新窗体并将其加载到MDI应用程序中。要使其可用,请将其编译为类库,然后在配置文件中添加对它们的引用。 财.软联盟.fs119.net

    财软联.盟.fs119.net

    财,管家园,fs119.net


    财管 家园 fs119.net

    财管家园 fs119.net

    财管家,园,fs119.net

      动态加载其他类型的类 财软联.盟.fs119.net

      此技术除了可用于窗体外,还可用于其他类型的类。但是,情况相对较复杂。在上面的示例中,之所以能够对System.Windows.Forms.Form类接口进行前期绑定是因为我们知道它是一个窗体。因此可以使用窗体的方法(例如,Show方法)。但对于我们自己创建的类,可以依据什么接口进行绑定呢? 财.管家园.fs119.net

      答案是创建我们自己的接口。实际上,这是一个重要的实现接口的典型示例。您可能在VisualBasic6.0中使用过接口。接口作为空类而创建。VisualBasic.NET中有了新的语法,接口与类完全分开,进行单独声明。在下面的步骤1中,我们会看到如何实现这一操作。

    财软联盟,fs119.net

      让我们设计一个可以动态加载类的示例。假设我们要编写一个需要操纵数据集的数据清理应用程序。但是,正如所有数据清理程序一样,它们似乎从来都没有完成。似乎总是需要为新的校验类型和清理任务编写代码。

    财软联盟 fs119.net

      当然,可以创建新的清理逻辑并重新编译整个应用程序,但如果可以动态插入新的数据清理功能而不必重新编译主应用程序,是不是会更好?下面让我们从头开始创建这样一个示例。 财软联盟.fs119.net

      步骤1:创建类文件以存放接口 财软联盟 fs119.net

      从概念上讲,在VisualBasic.NET中创建接口与在VisualBasic6.0中创建接口相似,但在语法上有很大不同。要创建初始接口类,请创建一个类型为ClassLibrary(类库)的新项目。将其命名为ScrubberInterface

    财.管家园.fs119.net

      在创建的类文件中,用以下代码替换文件中现有的代码行: 财管家园,fs119.net

    PublicInterfaceIScrubber
    SubScrub(ByValdsAsDataSet)
    EndInterface

    财管家园 fs119.net

      我们的接口非常简单。我们需要一个操作数据集的方法。已将此方法命名为Scrub

    财管家园,fs119.net

      现在,创建项目。ScrubberInterface.DLL将创建在项目的\bin目录下。

    财软联盟.fs119.net

      步骤2:创建清理应用程序

    财软联 盟 fs119.net

      清理应用程序与前面的窗体应用程序示例在许多方面都很相似。不同之处在于,我们将依次使用所有的数据清理类,而不是选择使用一个特定的类。 财软联 盟 fs119.net

      创建一个新的Windows窗体应用程序,然后将其命名为ClassesOnTheFly。在显示的Form1中放置以下控件: 财软联,盟,fs119.net

    控件类型 名称 属性设置 Button btnLoadDataset Text="LoadDataset" Button btnScrubDataset Text="ScrubDataset" DataGrid DataGrid1 不作更改 财管家 园 fs119.net

      在Form1的代码顶部,放置与前述示例顶部代码相同的代码:

    财软联盟 fs119.net

      ImportsSystem.Configuration
      ImportsSystem.Reflection 财.软联盟.fs119.net

      这里也需要一个模块级变量来存放配置信息集合。将以下代码行置于InheritsSystem.Windows.Forms.Form代码行的下方:

    财管家园,fs119.net

      DimcolAvailableClassesAsArrayList

    财 管家园 fs119.net

      步骤3:将数据集加载到网格中进行处理 财软联 盟 fs119.net

      为简化操作,将从XML文件中加载数据集。将以下XML文件放置到ClassesOnTheFly项目的\bin目录中,然后将其命名为TimeCardData.xml:

    财管家,园,fs119.net

    <TimeCardData>
    <Employee>
    <Name>SherlockHolmes</Name>
    <ID>123</ID>
    </Employee>
    <Employee>
    <Name>JohnWatson</Name>
    <ID>345</ID>
    </Employee>
    <Employee>
    <Name>IreneAdler</Name>
    <ID>567</ID>
    </Employee>
    <Employee>
    <Name>JabezWilson</Name>
    <ID>789</ID>
    </Employee>
    </TimeCardData> 财管家园.fs119.net

      我们需要一个模块级的数据集引用,所以请将以下代码行放置在声明colAvailableClasses的代码行的下方:

    财软联盟,fs119.net

      DimdsAsDataSet 财 管家园 fs119.net

    财管.家园.fs119.net

    财 管家园 fs119.net


    财管,家园,fs119.net

    财,软联盟,fs119.net

    财 软联盟 fs119.net

      要读取数据集并加载网格,请将以下代码放置到btnLoadDataset的click事件中: 财管家园,fs119.net

    ds=NewDataSet()
    ds.ReadXml("TimeCardData.xml")
    DataGrid1.DataSource=ds.Tables(0)

    财.软联盟.fs119.net

      然后运行程序,确保正确加载网格。

    财 软联盟 fs119.net

      步骤4:添加对清理程序接口的引用 财管家,园,fs119.net

      下面,我们需要添加对DLL的引用,该DLL是以前创建的,用来存放数据清理类的接口。选择Project|AddReference(项目|添加引用)。单击Browse(浏览)按钮,浏览到ScrubberInterface.DLL(在步骤1中创建),然后单击Open(打开)。单击OK(确定),添加引用。

    财管家.园.fs119.net

      步骤5:使类在可用窗体上存放数据 财软联 盟 fs119.net

      现在,复制以前窗体示例中使用的DynamicClass.vb模块,将其插入到ClassesOnTheFly项目中。可以不进行修改,直接使用。

    财软联,盟,fs119.net

      步骤6:创建配置文件以存放可用窗体

    财软联盟.fs119.net

      创建一个与前面窗体示例中使用的配置文件完全相同的配置文件。配置文件应如下显示:

    财管.家园.fs119.net

    <?xmlversion="1.0"encoding="utf-8"?>
    <configuration>
    <configSections>
    <sectionname="availableclasses"type="System.Configuration.NameValueSectionHandler"/>
    </configSections>
    <availableclasses>
    <addkey="Placeholder–donotload"
    value="DLLPathnameGoesHere~NameOfTypeGoesHere"></add>
    </availableclasses>
    </configuration> 财管家园,fs119.net

      请记住,将此文件放置到ClassesOnTheFly项目的\bin目录中,然后将其命名为ClassesOnTheFly.exe.config。

    财软联盟.fs119.net

      步骤7:将配置信息读入集合中

    财管家园 fs119.net

      此操作几乎与前面窗体示例中的操作完全相同,不同之处在于我们现在未将集合绑定到组合框。所以,复制窗体示例的FormLoad事件中使用的逻辑,但是省略最后三行代码(此三行代码用于执行绑定到组合框的操作)。将此逻辑粘贴到ClassesOnTheFly项目中Form1的FormLoad事件中。 财软联.盟.fs119.net

      步骤8:插入逻辑以加载和使用数据清理类 财管家园.fs119.net

      现在,在btnScrubDatasetclick事件中放置以下逻辑:

    财 管家园 fs119.net

    DimobjScrubberClassAsDynamicClass
    ForEachobjScrubberClassIncolAvailableClasses
    DimasmAssemblyContainingFormAs[Assembly]=_
    [Assembly].LoadFrom(objScrubberClass.Location)
    DimTypeToLoadAsType=_
    asmAssemblyContainingForm.GetType(objScrubberClass.Type)
    DimGenericInstanceAsObject
    GenericInstance=Activator.CreateInstance(TypeToLoad)

    DimScrubberAsScrubberInterface.IScrubber=_
    CType(GenericInstance,ScrubberInterface.IScrubber)
    Scrubber.Scrub(ds)
    Next 财 软联盟 fs119.net

    财管家.园.fs119.net

      此逻辑与动态加载窗体的逻辑有很多相似之处,这里不再作详细说明。主要的不同之处在于:

  • 对配置文件中的每一个类都进行动态加载。
  • 新实例化的对象被转换为ScrubberInterface.IScrubber类型。这样就可以绑定到IScrubber接口。
  • 执行每个对象的Scrub方法,在数据集中进行传递。
  • 财 软联盟 fs119.net

    财 软联盟 fs119.net


    财管 家园 fs119.net

  •   步骤9:编译并运行应用程序 财软联盟.fs119.net

      运行应用程序以确保能够正确编译。但是,先不要单击ScrubDataset(清理数据集)按钮,因为尚未创建清理类。

    财.软联盟.fs119.net

      应用程序编译完成后,关闭ClassesOnTheFly项目中的VisualStudio。

    财软.联盟.fs119.net

      步骤10:创建数据清理类 财 管家园 fs119.net

      在VisualStudio中,创建一个类型为ClassLibrary(类库)的新项目。将其命名为FirstClass。用以下代码替换Class1中自动插入的代码: 财软联盟,fs119.net

    PublicClassFirstClass
    ImplementsScrubberInterface.IScrubber
    PublicSubScrub(ByValdsAsDataSet)_
    ImplementsScrubberInterface.IScrubber.Scrub
    DimdrAsDataRow

    dr=ds.Tables(0).NewRow
    dr.Item(0)="ProfessorMoriarty"
    dr.Item(1)="666"
    ds.Tables(0).Rows.Add(dr)
    EndSub 财.软联盟.fs119.net

    EndClass 财软 联盟 fs119.net

    财软 联盟 fs119.net

      此类实现IScrubber接口(只是一个方法)。该方法获取数据集,并在数据集中添加一个单独的行。当然,实际的数据清理类中应已具备所有必要的数据操作逻辑。

    财软.联盟.fs119.net

      创建此项目以获取FirstClass.DLL。将DLL从项目的\bin目录复制到名为C:\ScrubberClasses的新目录中。

    财,软联盟,fs119.net

      步骤11:用新类更新配置文件

    财软.联盟.fs119.net

      现在,返回到ClassOnTheFly.exe.config。更改<availableclasses>标记中的内容,使其如下所示:

    财软联盟.fs119.net

    <addkey="FirstClass"
    value="C:\ScrubberClasses\FirstClass.dll~FirstClass.FirstClass"> 财管 家园 fs119.net

      保存配置文件,然后执行最后一步操作。

    财软 联盟 fs119.net

      步骤12:测试新的数据清理类的操作 财软 联盟 fs119.net

      现在,运行ClassesOnTheFly.exe并单击LoadDataset(加载数据集)按钮。请注意网格包含四行。单击ScrubDataset(清理数据集)按钮。网格中将显示第五行(这是由数据清理类添加的)。 财.管家园.fs119.net

      如果需要,可以添加其他清理类,在数据集上执行所需的任何操作。只需创建清理类并将其添加到配置文件中即可。这样,单击ScrubDataset(清理数据集)按钮时,将自动使用这些清理类。 财管.家园.fs119.net

      小结 财软 联盟 fs119.net

      这两个示例中最重要的一点是,在创建和编译原始应用程序(FormsOnTheFlyClassesOnTheFly)时,并不包含对后来动态加载的窗体和类的引用。实际上,这些窗体和类在编译应用程序时还没有创建! 财软联,盟,fs119.net

      创建窗体和类之后,只需在配置文件中引用它们的位置和类型,即可使用它们更新应用程序。可以根据需要创建新的窗体和类并进行动态添加。如果您的应用程序需要具有这种扩展功能,则可以使用.NET提供的完善解决方案,它具有反映和动态加载类的功能。 财软 联盟 fs119.net

    财,管家园,fs119.net

    财管.家园.fs119.net


    上一篇:VisualBasic.NET中访问数据的方法
    下一篇:如何用VB.Net创建一个三层的数据库应用程序

    精品课程推荐