概述
? ? ?程序運行時,通過反射可以得到其它程序集或者自己程序集代碼的各種信息,包括類、函數、變量等來實例化它們,執行它們,操作它們,實際上就是獲取程序在內存中的映像,然后基于這個映像進行各種操作。
Assembly介紹
Assembly類即程序集類,用來加載其他程序集,加載后可以用Type來使用其他程序集中的信息,如果想要使用其它程序集中的內容,需要先加載程序集。
加載程序集的三種方法:
①、一般用來加載同一文件下的其他程序集
Assembly assembly = Assembly.Load(“AssemblyName”);
②、一般用來加載不再同一文件下的其他程序集
Assembly assembly = Assembly.LoadFrom(“包含程序集清單的文件的名稱或路徑”);
Assembly assembly = Assembly.LoadFile(“要加載的文件的完全限定路徑”);
使用方法:
Assembly asm = Assembly.LoadFrom("Demo.dll");//需要加后綴,可以指定路徑,如:Assembly.LoadFrom(@"C:\Users\majm\source\repos\ConsoleApp29\bin\Debug\TestDll.dll");
Assembly asm = Assembly.Load("Demo");//無需加后綴,不可以指定路徑,
使用Load可以加載當前程序bin目錄行下的程序集或者系統程序集
定義數據模型:創建類庫并生成dll
namespace TestDll
{public class Person{public Person(){Name = "zls";Age = 18;id = 20;}public Person(string name, int age){Name = name;Age = age;id = 21;}public string Name { get; set; }public int Age { get; set; }public int id;public int Score(int a, int b){return a + b;}}
}
第一步:首先加載一個指定程序集:
Assembly assembly = Assembly.LoadFrom(@"C:\Users\majm\source\repos\ConsoleApp29\bin\Debug\TestDll.dll");Type[] types = assembly.GetTypes();for (int i = 0; i < types.Length; i++){Console.WriteLine(types[i]);}
運行結果:
第二步:加載程序集中類對象:并調用方法傳入參數
Type c1 = types[0];object obj = Activator.CreateInstance(c1);//調用Class1類中的Speak方法MethodInfo speak = c1.GetMethod("Score");object[] o = new Object[2] {12,13 };var result = speak.Invoke(obj, o);Console.WriteLine(result);
運行結果:25
這里還可以這樣如下去創建實例:
Type c1 = types[0];Assembly asm = Assembly.GetAssembly(c1);Person person = (Person)asm.CreateInstance("TestDll.Person", true);//true:不區分大小寫//調用Person1類中的Score方法MethodInfo speak = c1.GetMethod("Score");object[] o = new Object[2] {12,13 };var result = speak.Invoke(person, o);Console.WriteLine(result);
一樣的效果,如果是當前程序集,可以GetExecutingAssembly獲取程序集
Assembly asm = Assembly.GetExecutingAssembly();