http://blog.csdn.net/penua/archive/2006/06/26/837255.aspx
起因:欲開發一報表系統,能動態載入報表程式
該系統基於外掛程式式架構,即除了登入程式和主程式外,其它所有功能均通過後期載入的方式調用,每個組件實現一個特定的報表(或其它功能)
基本思路:
1)登入程式
判斷使用者身份,並根據參數判斷能否進入系統,驗證通過後返回所有使用者資料(許可權、基本資料)
參數:子系統代碼
許可權資訊:可用功能列表
基本資料:個人資訊、科室資訊
2)主畫面
擷取上述資訊並存於全域對象中
主畫面可以實現準系統,如修改密碼、日誌查詢等
主畫面實現外掛程式載入功能,並把使用者資訊傳入組件
主畫面在載入外掛程式之前需進行有效性驗證,即判斷使用者權限、判斷各個介面方法是否有效
主畫面實現外掛程式間通訊功能,允許各個組件通過把資料共用
3)外掛程式
提供有效性驗證功能,提供許可權要求
能擷取主畫面傳入的使用者資訊,並存入特定對象中
外掛程式間通訊功能
一、動態載入控制項
動態載入,最基本用到的就是反射機制。在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 對象,該對象定義一組屬性並啟用綁定,而綁定可能涉及選擇重載方法、 強制參數類型和通過反射調用成 員。 若為空白引用,則使用 DefaultBinder。
target
要在其上調用指定成員的 Object。
args
包含傳遞給要調用的成員的參數的數組。
傳回值
表示被調用成員的傳回值的 Object。
二、外掛程式架構