c# 反射機制的基本瞭解 阿新 • • 發佈:2018-11-03 1.反射機制的簡單介紹 反射機制,有一個應用方面就是用來做外掛,這麼外掛具體以後會做成什麼樣,我們不清楚,但反射機制使我們可以執行使用這個外掛。 也就是說,反射機制使我們可以使用一些未知的型別,未知的函式方法等 2.使用之前先大概瞭解下應用程式的結構 基本是範圍最大到最小 AppDomain:應用程式域,應用程式在其中執行的獨立執行環境(最大) Assembly:程式集 (包含一個或多個Module) Module:模組 Type:型別 3.具體怎麼用 dll程式碼 /* using System; namespace ExternDll { class Program { static void Main() { Console.WriteLine("ExternDll執行中"); } } } */ (1)引入需要程式集(exe、dll檔案): Assembly ExternDll = Assembly.Load("ExternDll"); (2)得到模組(單模組的程式集可忽略): Module module=ExternDll.ManifestModule; (3)得到所要的型別: Type DllType= module.GetType("ExternDll.Program"); // Type DllType = ExternDll.GetType("ExternDll.Program"); (4)如果要使用某個型別中的方法,先建立型別例項,在得到方法 MethodInfo methodInfo=DllType.GetMethod("Main",BindingFlags.Static |BindingFlags.Public|BindingFlags.NonPublic); object o = Activator.CreateInstance(DllType); methodInfo.Invoke(o, new object[] { }); 注意的問題: (1)Assembly載入方法的使用 Assembly.Load() Assembly.LoadFrom() Assembly.LoadFromFile() Assembly.ReflectionOnlyLoadFrom(String assemblyFile) Assembly.ReflectionOnlyLoad(byte[] rawAssembly) Assembly.ReflectionOnlyLoad(String assemblyName) (2)BindingFlags的使用(從程式集篩選所需要的型別Type) NonPublic:非Public修飾的 (需要與Static或Instance組合使用) Public:Public修飾的 (需要與Static或Instance組合使用) Static:靜態的 Instance:例項的 DeclaredOnly:指定只獲取自己定義的 GetField SetField BindingFlags.CreateInstance (3) Activator.CreateInstance用法(可以用這個方法建立型別例項) (4)Appdomain的使用 Appdomain類似輕量級程序,是 .net / mono 程式碼執行時的一個邏輯容器 一般情況下不需要關注Appdomain,除非以下的情況: (1)動態解除安裝程式集(執行時載入程式集是不支援Unload的) (2)實現程式隔離 (3)限制程式碼安全 (4)載入相同程式的不同版本 (5)有效利用資源 (6)減少記憶體佔用 (5)早繫結與晚繫結 早繫結:編譯器或直譯器能知道程式碼中所指定的具體型別,能給出提示 晚繫結:程式執行才知道具體型別 學習連線:c#反射機制學習和利用反射獲取型別資訊