分享
 
 
 

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

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

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

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

<add key="First Form"

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

<add key="Second Form"

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

<add key="Third Form"

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

如果要更改窗体的位置或名称,则需要对以上代码行进行相应修改。

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

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

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

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

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

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

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

步骤 1:创建类文件以存放接口 从概念上讲,在 Visual Basic .NET 中创建接口与在 Visual Basic 6.0 中创建接口相似,但在语法上有很大不同。要创建初始接口类,请创建一个类型为 Class Library(类库)的新项目。将其命名为 ScrubberInterface。

在创建的类文件中,用以下代码替换文件中现有的代码行:

Public Interface IScrubber

Sub Scrub(ByVal ds As DataSet)

End Interface

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

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

步骤 2:创建清理应用程序 清理应用程序与前面的窗体应用程序示例在许多方面都很相似。不同之处在于,我们将依次使用所有的数据清理类,而不是选择使用一个特定的类。

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

控件类型名称属性设置Button

btnLoadDataset

Text = "Load Dataset"

Button

btnScrubDataset

Text = "Scrub Dataset"

DataGrid

DataGrid1

不作更改

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

Imports System.Configuration

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

Dim colAvailableClasses As ArrayList

步骤 3:将数据集加载到网格中进行处理

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

<TimeCardData>

<Employee>

<Name>Sherlock Holmes</Name>

<ID>123</ID>

</Employee>

<Employee>

<Name>John Watson</Name>

<ID>345</ID>

</Employee>

<Employee>

<Name>Irene Adler</Name>

<ID>567</ID>

</Employee>

<Employee>

<Name>Jabez Wilson</Name>

<ID>789</ID>

</Employee>

</TimeCardData>

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

Dim ds As DataSet 要读取数据集并加载网格,请将以下代码放置到 click 事件中:

ds = New DataSet()

ds.ReadXml("TimeCardData.xml")

DataGrid1.DataSource = ds.Tables(0)

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

步骤 4:添加对清理程序接口的引用 下面,我们需要添加对 DLL 的引用,该 DLL 是以前创建的,用来存放数据清理类的接口。选择 Project | Add Reference(项目|添加引用)。单击

Browse(浏览)按钮,浏览到 ScrubberInterface.DLL(在步骤 1 中创建),然后单击 Open(打开)。单击 OK(确定),添加引用。

步骤 5:使类在可用窗体上存放数据 现在,复制以前窗体示例中使用的 DynamicClass.vb 模块,将其插入到 ClassesOnTheFly 项目中。可以不进行修改,直接使用。

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

<?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>

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

步骤 7:将配置信息读入集合中 此操作几乎与前面窗体示例中的操作完全相同,不同之处在于我们现在未将集合绑定到组合框。所以,复制窗体示例的 Form Load 事件中使用的逻辑,但是省略最后三行代码(此三行代码用于执行绑定到组合框的操作)。将此逻辑粘贴到 ClassesOnTheFly 项目中 Form1 的 Form Load 事件中。

步骤 8:插入逻辑以加载和使用数据清理类 现在,在 btnScrubDataset 的 click 事件中放置以下逻辑:

Dim objScrubberClass As DynamicClass

For Each objScrubberClass In colAvailableClasses

Dim asmAssemblyContainingForm As [Assembly] = _

[Assembly].LoadFrom(objScrubberClass.Location)

Dim TypeToLoad As Type = _

asmAssemblyContainingForm.GetType(objScrubberClass.Type)

Dim GenericInstance As Object

GenericInstance = Activator.CreateInstance(TypeToLoad) Dim Scrubber As ScrubberInterface.IScrubber = _

CType(GenericInstance, ScrubberInterface.IScrubber)

Scrubber.Scrub(ds)

Next

此逻辑与动态加载窗体的逻辑有很多相似之处,这里不再作详细说明。主要的不同之处在于: 对配置文件中的每一个类都进行动态加载。 新实例化的对象被转换为 ScrubberInterface.IScrubber 类型。这样就可以绑定到 IScrubber 接口。 执行每个对象的 Scrub 方法,在数据集中进行传递。 步骤 9:编译并运行应用程序 运行应用程序以确保能够正确编译。但是,先不要单击 Scrub Dataset(清理数据集)按钮,因为尚未创建清理类。

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

步骤 10:创建数据清理类 在 Visual Studio 中,创建一个类型为 Class Library(类库)的新项目。将其命名为 FirstClass。用以下代码替换 Class1 中自动插入的代码:

Public Class FirstClass

Implements ScrubberInterface.IScrubber

Public Sub Scrub(ByVal ds As DataSet) _

Implements ScrubberInterface.IScrubber.Scrub

Dim dr As DataRow dr = ds.Tables(0).NewRow

dr.Item(0) = "Professor Moriarty"

dr.Item(1) = "666"

ds.Tables(0).Rows.Add(dr)

End Sub

End Class

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

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

步骤 11:用新类更新配置文件 现在,返回到 ClassOnTheFly.exe.config。更改

<add key="First Class"

value="C:\ScrubberClasses\FirstClass.dll~FirstClass.FirstClass">

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

步骤 12:测试新的数据清理类的操作 现在,运行 ClassesOnTheFly.exe 并单击 Load Dataset(加载数据集)按钮。请注意网格包含四行。单击 Scrub Dataset(清理数据集)按钮。网格中将显示第五行(这是由数据清理类添加的)。

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有