概念
反射 能夠查看中繼資料的類型,等資訊的一種能力。
中繼資料 編譯以後最基本的資料單元。本質上就上一大追表。當程式編譯之後就能形成很多表,比如類定義表,欄位定義表,方法定義表。
反射技術 就是使用REFLACSIOIN命名空間下的工具允許你解析這些中繼資料代表的代碼.
PE檔案 被稱為可移植的執行體是PortableExecute的全稱,常見的EXE、DLL、OCX、SYS、COM都是PE檔案,PE檔案是微軟Windows作業系統上的程式檔案(可能是間接被執行,如DLL).在.net程式中pe檔案包含兩部分,一部分是中繼資料資訊,另外一部分是msIL資訊(msil以及標記中繼資料資訊的部分。)
使用的命名空間
System.refloction
System.Type
作用
反射的主要作用是用來擴充系統和動態調用程式集 :
擴充系統:
所謂擴充系統就是先把系統寫好,系統裡面定義介面,後面開發的人去寫介面的代碼。此時該系統就要用反射了,系統用反射調用介面,當介面沒寫,系統利用反射就不會出錯,此時就等於沒實現此功能而已,當介面被人寫好了,系統就會自動調用介面的功能展現在系統上。反射實現隨插即用功能。
動態調用程式集
動態調用程式集就是利用反射去調用編譯好的dll,當然此時的dll沒有被引用到你所建的工程裡面。當你編譯你的工程時,不會編譯你調用的dll,當你運行到調用dll時,此時才會去調用dll,判斷是否有文法語義,等編譯,啟動並執行錯誤。這樣利用反射具有一定靈活性,就是不用從你的工程調用dll,還有就是dll可隨時改變(當然介面還是要對應),不需改變你所建的工程。
範例程式碼
class Program { static void Main(string[] args) { Console.WriteLine("測試程反射技術。。。"); Assembly ass; Type type; object obj; //1 載入程式集 ass = Assembly.LoadFile(@"D:\MYProject\Thread_sTU\DLL_reflection\bin\Debug\DLL_reflection.dll"); //2 根據程式集資訊擷取程式集的類型資訊. 注意這個方法就是擷取中繼資料中的定義的各種類型(類,方法,屬性等)資訊。 type = ass.GetType("DLL_reflection.Class1"); //3 根據類型資訊擷取方法對象 MethodInfo method = type.GetMethod("text"); //4 處理方法對象的參數對象。 object[] paramobj = new object[0] ; //5 建立程式集執行個體 obj = ass.CreateInstance("DLL_reflection.Class1"); //6 根據方法對象,以及執行個體對象,方法出參數對象 調用此函數。 method.Invoke(obj, paramobj); Console.WriteLine("測試程反射技術 END "); Console.ReadLine(); } }}