如何動態載入控制項以及外掛程式編程思想(C#)
來源:互聯網
上載者:User
編程|動態|載入|控制項 關鍵詞:動態載入,控制項,外掛程式
控制項,在實現快速開發中起著非常重要的作用,它可以將某一特定功能封裝起來,供可戶程式員調用,更重要的是它還可以實現外掛程式式開發,使軟體的靈活性、可擴充性大大增強。在網路上,也有很多動態載入控制項、動態調用類成員等的資料。下面,我就將動態載入控制項總結一下,以供大家參考。(不過由於本人水平有限,不一定有參考價值,寫出來一方面是為了總結自己,以求提高,另一方面也希望各為朋友看到我的不足,給我提出寶貴意見)
一、動態載入控制項
動態載入,最基本用到的就是反射機制。在System.Reflection的namespace下有一系列的關於擷取Assembly資訊、類(型)資訊的類、介面、結構等。可能上面的話對急切想實現動態載入控制項的朋友來說可能一點用也沒有,那麼就看下面的代碼吧,也許可以使你馬上實現你想要的:
//載入控制項
Assembly assembly = Assembly.LoadFrom(@"C:\Controls.dll");
//獲得類(型)
Type type = assembly.GetType("Controls.UserControl",false,true);
//設定篩選標誌
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public
| BindingFlags.NonPublic | BindingFlags.Instance;
//調用建構函式並獲得對象
Object obj = type.InvokeMember("UserControl", bflags |
BindingFlags.CreateInstance, null, null, null);
//將對象轉換類型
System.Windows.Forms.Control c = (Control)obj;
//將控制項添加到表單
this.Controls.Add(c);
下面對上面程式段用到的一些變數、方法做一點說明
1、BindingFlags,枚舉類型
BindingFlags.Instance : 對象執行個體
BindingFlags.Static : 靜態成員
BindingFlags.Public : 指可在搜尋中包含公用成員
BindingFlags.NonPublic : 指可在搜尋中包含非公用成員(即私人成員和受保護的成員)
BindingFlags.FlattenHierarchy : 指可包含階層上的靜態成員
BindingFlags.IgnoreCase : 表示忽略 name 的大小寫
BindingFlags.DeclaredOnly : 僅搜尋 Type 上聲明的成員,而不搜尋被簡單繼承的成員
BindingFlags.CreateInstance : 表示調用建構函式。忽略 name。對其他調用標誌無效
2、Type.InvokeMember
public object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args
);
參數
name
String,它包含要調用的建構函式、方法、屬性或欄位成員的名稱。
- 或 -
Null 字元串 (""),表示調用預設成員。
invokeAttr
一個位屏蔽,由一個或多個指定搜尋執行方式的 BindingFlags 組成。 訪問可以是 BindingFlags 之一,如Public、 NonPublic、Private、 InvokeMethod 和 GetField 等。不需要指定尋找類型。如果省略尋找類型, 則將應用 BindingFlags.Public | BindingFlags.Instance。
binder
一個 Binder 對象,該對象定義一組屬性並啟用綁定,而綁定可能涉及選擇重載方法、 強制參數類型和通過反射調用成 員。 - 或 - 若為空白引用(Visual Basic 中為 Nothing),則使用 DefaultBinder。
target
要在其上調用指定成員的 Object。
args
包含傳遞給要調用的成員的參數的數組。
傳回值
表示被調用成員的傳回值的 Object。
二、外掛程式編程
通過上面程式碼片段,我們基本實現動態載入控制項。由此我想到了現在網上提到很多的外掛程式式的開發方法。通過動態載入控制項,我們不是能很方便的為軟體擴充功能嗎?我不知道Eclipse這種外掛程式是怎麼實現的,但至少這種動態載入控制項的方法實現外掛程式編程的一個變通的方法。不是嗎?我把一個功能模組做成一個控制項,然後在程式啟動是掃描目錄,即可獲得所有的控制項,當點擊菜單是,將控制項載入到表單就行了。我在母體程式裡,我們所要做的只不過要一個容器視窗類別來載入控制項。當然,事先要有些約定,比如說,控制項有哪些可供調用的方法等等。
參考資料:
1. (C#)利用反射動態調用類成員 作者: lizanhong
2. 在C#程式中實現外掛程式架構 作者:Shawn Patrick Walcheske 譯者:電子科技大學 夏桅
3. Building .NET Assemblies Dynamically 作者: Govinda