前段時間敲**,需要動態的載入的外部dll,並且解析dll,來讀取dll中的類,屬性,有時候還需要讀取特性的值。這個問題剛開始遇到,是一點想法沒有,以前沒有這麼用過,後來查資料,請教別人,終於有了結果。當有了**之後,發現在找問題的過程中,我糊塗了,因為解決這個問題的方式主要是——反射。我是通過利用反射進行dll的動態載入和呼叫。下面來看看我的實現吧。
我做的例子是通過讀取dll的路徑來載入dll,然後遍歷的讀取dll的類名,遍歷每個類的屬性,和類以及屬性的特性。
主要**有這幾個:
1、引導程式集:
a ssembly ass=assembly.loadfrom(dllpath);
assembly.loadfile 只載入指定檔案,並不會自動載入依賴程式集.assmbly.load無需後輟名
2、利用型別的命名空間和名稱獲得類的型別
type type=ass.gettype(「typename」);
3、利用指定的引數例項話型別
object bj = activator.createinstance(type,params);
4、通過方法名稱獲得方法
methodinfo mi=type.getmethod(「mehtodname」);
5、根據引數直線方法,返回值就是原方法的返回值
mi.invoke(obj,params);
6、載入類裡面的屬性
propertyinfo p = this.gettype().getproperty("***");
例項如下:
/// /// 動態載入實體dll
///
///
public actionresult loadentitydll(string path)
else
//載入屬性
string strnamespace = types.namespace;
dynamicloadproperty(strnamespace, name, a); }}
return view("xx");
}/// /// 讀取實體屬性--王勇霞
///
public void dynamicloadproperty(string strnamespace, string classname, a a)
else
}#endregion
}#endregion
總結:以上是兩個方法,乙個是載入dll的類,乙個是讀取類中的屬性,其實大家仔細觀察會發現。這段**的的眼,及一句話我認為,就是反射的這句:
ass = new loaddll(path).getassembly();
剩下的載入類,載入方法,載入屬性,載入特性,都是順便的事情。但是在開始的時候,就是沒有想到?為什麼?
事後反思,一是**經驗不夠,二是沒有靜下來好好思考這個問題。以前學習設計模式的時候就接觸反**,現在看來是沒有理解反射的原理。反射本就是「讀取類的一種方式,通過字串來找到類」。這次又算是對反射的查漏補缺。最後把反射的概念分享給大家:
c 反射本地Dll檔案
這篇 實現了本地路徑查詢dll檔案,與例項化物件類的方法來引用方法,具體看 剛學的做個筆記 using system using system.collections.generic using system.linq using system.text using system.threading...
c 反射 動態載入dll簡單例子
假設已有元件classlibrarytest.dll,放置於程式目錄下。元件中classlibrarytest命名空間下有test類,類中有方法sum。下面示例就是動態載入元件並呼叫sum方法的簡例 1 static void main string args 2 classlibrarytest....
C 通過反射呼叫DLL內部函式
依賴 using system.reflection 載入dll檔案 assembly assembly assembly.loadfile dll的路徑 獲取型別,引數 命名空間.類名 type type assembly.gettype namespace.classname 建立該物件的例項,...