如何動態加載控件以及插件編程思想(C#)
2024-07-21 02:19:33
供稿:網友
關鍵詞:動態加載,控件,插件
控件,在實現快速開發中起著非常重要的作用,它可以將某一特定功能封裝起來,供可戶程序員調用,更重要的是它還可以實現插件式開發,使軟件的靈活性、可擴充性大大增強。在網絡上,也有很多動態加載控件、動態調用類成員等的資料。下面,我就將動態加載控件總結一下,以供大家參考。(不過由于本人水平有限,不一定有參考價值,寫出來一方面是為了總結自己,以求提高,另一方面也希望各為朋友看到我的不足,給我提出寶貴意見)
一、動態加載控件
動態加載,最基本用到的就是反射機制。在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,它包含要調用的構造函數、方法、屬性或字段成員的名稱。
- 或 -
空字符串 (""),表示調用默認成員。
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