C 解析DLL 反射

2021-06-28 12:45:06 字數 1575 閱讀 4064

前段時間敲**,需要動態的載入的外部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 建立該物件的例項,...