標籤:c# 反射 dll
1、什麼是反射
可以Ildasm反編譯工具瀏覽一個dll和exe的構成。
用於運行時通過編程方式獲得類型資訊。是把程式外的程式集(Dll)載入進來,然後動態調用程式集裡的公開屬性,方法等。反射描述了在運行過程中檢查和處理常式元素的過程,是一個運行庫發現的過程。
反射提供了封裝程式集、模組和類型的對象(Type類型)。可以使用反射動態建立類型的執行個體,將類型綁定到現有對象,或從現有對象擷取類型並調用其方法或訪問其欄位和屬性。還可以獲得每個成員的名稱、限定符、參數等。有了反射,即可以對每一個類型了如指掌。如果獲得了建構函式資訊,即可以直接建立對象,即使這個對象的類型在編譯時間還不知道。
//就是根據類型的中繼資料,動態獲得類型或執行個體地資訊//例如,public class MyClass{ public void SayHello() { }}現在我知道它有個方法 是SayHello,那我就可以通過反射的方式來調用該方法 。一般情況下:MyClass myClass = new Myclass();myClass.SayHello();而通過反射MyClass myClass=new MyClass();Type type=typeof(MyClass);type.GetMethod("SayHello").Invoke(myClass,null);
2、程式碼在編譯後產生可執行檔應用,我們首先要瞭解這種可執行應用程式的結構。
應用程式結構分為應用程式定義域—程式集—模組—類型—成員幾個層次,公用語言運行庫載入器管理應用程式域,這種管理組件括將每個程式集載入到相應的應用程式定義域以及控制每個程式集中類型階層的記憶體布局。
程式集包含模組,而模組包含類型,類型又包含成員,反射則提供了封裝程式集、模組和類型的對象。我們可以使用反射動態地建立類型的執行個體,將類型綁定到現有對象或從現有對象中擷取類型,然後調用類型的方法或訪問其欄位和屬性。反射通常具有以下用途。
(1)使用Assembly定義和載入程式集,載入在資訊清單中列出模組,以及從此程式集中尋找類型並建立該類型的執行個體。
(2)使用Module瞭解包含模組的程式集以及模組中的類等,還可以擷取在模組上定義的所有全域方法或其他特定的非全域方法。
(3)使用ConstructorInfo瞭解建構函式的名稱、參數、存取修飾詞(如pulic 或private)和實現詳細資料(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來調用特定的建構函式。
(4)使用MethodInfo瞭解方法的名稱、傳回型別、參數、存取修飾詞(如pulic 或private)和實現詳細資料(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法來調用特定的方法。
(5)使用FiedInfo瞭解欄位的名稱、存取修飾詞(如public或private)和實現詳細資料(如static)等,並擷取或設定欄位值。
(6)使用EventInfo瞭解事件的名稱、事件處理常式資料類型、自訂屬性、宣告類型和反射類型等,添加或移除事件處理常式。
(7)使用PropertyInfo瞭解屬性的名稱、資料類型、宣告類型、反射類型和唯讀或可寫狀態等,擷取或設定屬性值。
(8)使用ParameterInfo瞭解參數的名稱、資料類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
System.Reflection.Emit命名空間的類提供了一種特殊形式的反射,可以在運行時構造類型。
反射也可用於建立稱為類型瀏覽器的應用程式,使使用者能夠選擇類型,然後查看有關選定類型的資訊。
此外,Jscript等語言編譯器使用反射來構造符號表。System.Runtime.Serialization命名空間中的類使用反射來訪問資料並確定要永久儲存的欄位,System.Runtime.Remoting命名空間中的類通過序列化來間接地使用反射。
參考:
http://blog.csdn.net/helloguonan/article/details/5912523
本文出自 “Ricky's Blog” 部落格,請務必保留此出處http://57388.blog.51cto.com/47388/1655189
30. C# -- 反射(2)