常見的兩種程序集:
可執行文件(.exe文件)和 類庫文件(.dll文件)。
在VS開發環境中,一個解決方案可以包含多個項目,而每個項目就是一個程序集。
他們之間是一種從屬關系,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,一個Module能夠包括N個Type,一個Type能夠包括N個成員。他們都在System.Reflection命名空間下。【公共語言運行庫CLR】加載器 管理 應用程序域,這種管理包括 將每個程序集加載到相應的應用程序域 以及 控制每個程序集中類型層次結構的內存布局。
模塊是可移植的可執行文件,例如 type.dll 或 application.exe,由一個或多個類和接口組成。 單個模塊可包含多個命名空間,而一個命名空間可跨越多個模塊。
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(@"F:\2025\study\CsAssembly\TestDll\bin\Debug\TestDll.dll");
Type[] types = assembly.GetTypes();
for (int i = 0; i < types.Length; i++)
{Console.WriteLine(types[i]);
}
運行結果:
第二步:加載程序集中類對象:并調用方法傳入參數
Type c1 = types[1];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();
二、Assembly程序集對象
1.獲得當前對象所屬的類所在的程序集
this.GetType().Assembly;
2.根據路徑加載程序集
Assembly.LoadFrom(assPath);
3.獲得當前【應用程序域】中的所有程序集
Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();foreach(Assembly assembly2 in ass){MessageBox.Show($"assembly={assembly2}");}
三、Type類型對象
1.獲得程序集中定義的所有的public類
2.獲得程序集中定義的所有的類
//獲得程序集中定義的所有的public類Type[] allPublicTypes = ass1.GetExportedTypes();
//獲得程序集中定義的所有的類Type[] allTypes = ass1.GetTypes();
?3.用assembly對象,通過類的full name類獲得type對象
Assembly ass1 = Assembly.LoadFrom(@"F:\2025\study\CsAssembly\TestDll\bin\Debug\TestDll.dll");
//GetType的參數一定要是full name的string
Type tStu = ass1.GetType("TestDll.Student");
//Activator通過類型創建實體
object stu1 = Activator.CreateInstance(tStu);
?//強制轉換