国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

Visual Basic .NET 中動態加載類 (三)

2024-07-10 12:59:10
字體:
來源:轉載
供稿:網友
··microsoft


 步驟 8:用新的窗體信息更新配置文件

  現在,我們已經創建了一些新窗體,還需要在配置文件中引用它們。請用以下代碼行替換 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 窗體。



圖 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
  這里也需要一個模塊級變量來存放配置信息集合。將以下代碼行置于 inherits system.windows.forms.form 代碼行的下方:

  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>

  我們需要一個模塊級的數據集引用,所以請將以下代碼行放置在聲明 colavailableclasses 的代碼行的下方:

  dim ds as dataset
  要讀取數據集并加載網格,請將以下代碼放置到 btnloaddataset 的 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。更改 <availableclasses> 標記中的內容,使其如下所示:

<add key="first class"
value="c:/scrubberclasses/firstclass.dll~firstclass.firstclass">

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

  步驟 12:測試新的數據清理類的操作
  現在,運行 classesonthefly.exe 并單擊 load dataset(加載數據集)按鈕。請注意網格包含四行。單擊 scrub dataset(清理數據集)按鈕。網格中將顯示第五行(這是由數據清理類添加的)。

  如果需要,可以添加其他清理類,在數據集上執行所需的任何操作。只需創建清理類并將其添加到配置文件中即可。這樣,單擊 scrub dataset(清理數據集)按鈕時,將自動使用這些清理類。

  小結
  這兩個示例中最重要的一點是,在創建和編譯原始應用程序(formsonthefly 和 classesonthefly)時,并不包含對后來動態加載的窗體和類的引用。實際上,這些窗體和類在編譯應用程序時還沒有創建!

  創建窗體和類之后,只需在配置文件中引用它們的位置和類型,即可使用它們更新應用程序。可以根據需要創建新的窗體和類并進行動態添加。如果您的應用程序需要具有這種擴展功能,則可以使用 .net 提供的完善解決方案,它具有反映和動態加載類的功能。




收集最實用的網頁特效代碼!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 济南市| 来凤县| 潞西市| 绩溪县| 甘孜县| 扶沟县| 淮安市| 德州市| 汾阳市| 龙海市| 什邡市| 封开县| 丹棱县| 锦州市| 新蔡县| 渭南市| 富川| 静宁县| 古交市| 盈江县| 南开区| 大英县| 苏尼特左旗| 武汉市| 湘阴县| 贵德县| 从化市| 宝兴县| 琼结县| 万山特区| 阿拉尔市| 泸水县| 日喀则市| 岑巩县| 尤溪县| 锡林浩特市| 枣阳市| 靖安县| 泗水县| 城市| 宣恩县|