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 屬性中獲?。┑淖址M行引用。對類型的引用保存在 typetoload 中。
reflection 類和 activator 類使用它們的 createinstance 方法創建類型的實例。(createinstance 與 visual basic 6.0 中的 createobject 類似。)但是,實例必須是類型對象,因為該類型要動態加載。
最后,新實例化的對象(實際上是一個窗體)必須轉換為正確的類型才能啟用前期綁定。我們知道它是一個窗體,所以可以使用 ctype 函數將其轉換為窗體。
最后,將新窗體設置為 mdi 父窗體的子窗體并對其進行顯示。
注意:從 death of the browser?(英文)所示的 url 處加載的程序集被復制到本地緩存中。從 unc 加載的程序集(如本文中的程序集)僅在當前位置使用,不被復制到任何緩存中。
步驟 6:編譯應用程序
現在,我們可以編譯應用程序,但由于尚未創建任何窗體,所以不會顯示任何窗體??梢跃幾g并運行程序,確保它能夠工作并確保組合框能夠正確加載占位符項。如果單擊 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 的項目重復上述操作。在每個窗體中拖入不同的控件以便于區分。也可以將每個窗體的背景色更改為獨特的顏色。