C# 程式集Assembly
原諒我到目前為止一直膚淺的認為程式集就是dll,這種想法是錯誤的。
今天就係統的學習記錄一下“程式集”的概念。原文連結https://www.cnblogs.com/czx1/p/201413137070-com.html
程式集包含了兩種檔案:可執行檔案(.exe檔案)和 類庫檔案(.dll檔案)。
在VS開發環境中,一個解決方案可以包含多個專案,而每個專案就是一個程式集。
應用程式結構:包含 應用程式域(AppDomain),程式集(Assembly),模組(Module),型別(Type),成員(EventInfo、FieldInfo、MethodInfo、PropertyInfo) 幾個層次。
他們之間是一種從屬關係,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,一個Module能夠包括N個Type,一個Type能夠包括N個成員。他們都在System.Reflection名稱空間下。【公共語言執行庫CLR】載入器 管理 應用程式域,這種管理包括 將每個程式集載入到相應的應用程式域 以及 控制每個程式集中型別層次結構的記憶體佈局。
從【應用程式結構】中不難看出程式集Assembly的組成:
MemberInfo 該類是一個基類,它定義了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多個公用行為 。
一個程式執行起來以後,有一個應用程式域(AppDomain),在這個應用程式域(AppDomain)中放了我們用到的所有程式集(Assembly)。我們所寫的所有程式碼都會編譯到【程式集】檔案(.exe .dll)中,並在執行時以【Assembly物件】方式載入到記憶體中執行,每個類(Class Interface)以【Type物件】方式載入到內存,類的成員(方法,欄位,屬性,事件,構造器)載入到記憶體也有相應的物件。
Assembly程式集物件 https://blog.csdn.net/CJB_King/article/details/80521481
Assembly 是一個抽象類,我們用的都是RuntimeAssembly的物件。
獲得程式集的方式:
1. 獲得當前【應用程式域】中的所有程式集
Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();
所有用到過得aessembly。如果只是add ref了,沒有在程式中用到,AppDomain.CurrentDomain.GetAssemblies()中沒有。用到時才被JIT載入到記憶體。
每個app都有一個AppDomain,OS不允許其他app訪問這個程式的AppDomain
2. 獲得當前物件所屬的類所在的程式集
this.GetType().Assembly;
Type物件肯定在一個assembly物件中
可以通過Type物件得到程式集。
3. 根據路徑載入程式集
Assembly.LoadFrom(assPath);
Type型別物件
Type 是一個抽象類,我們用的都是TypeInfo類的物件。
程式執行時,一個class對應一個Type類的物件。通過Type物件可以獲得類的所有資訊。獲得Type物件的方式:
1. 通過類獲得對應的Type
Type t1 = typeof(Person);
2. 通過物件獲得Type
Type t2 = person.GetType(); this.GetType();
3. 用assembly物件,通過類的full name類獲得type物件
Assembly ass1 = Assembly.LoadFrom(@"c:\users\xcao\documents\visual studio 2012\Projects\ConsoleApplication6\ConsoleApplication6\libs\Ecole.dll"); //GetType的引數一定要是full name的string Type tStu = ass1.GetType("Ecole.Student");
object stu1 = Activator.CreateInstance(tStu);
4. 獲得程式集中定義的所有的public類
Type[] allPublicTypes = ass1.GetExportedTypes();
5. 獲得程式集中定義的所有的類
Type[] allTypes = ass1.GetTypes();
Type類的屬性:
t.Assembly; 獲取t所在的程式集
t.FullName; 獲取t所對應的類的full name
t.Name; 獲取t所對應的類的 name
t.IsArray; 判斷t是否是一個數組類
t.IsEnum; 判斷t是否是一個列舉類
t.IsAbstract; 判斷t是否是一個抽象類
t.IsInterface; 判斷t是否是一個interface
Type類的方法:
notebookInterfaceType.IsAssignableFrom(Type t);判斷t是否實現了 notebookInterfaceType 介面
t.IsSubclassOf(Type parent); t是否是parent的子類
t.IsInstanceOfType(object o); o是否是t類的物件
t.GetFields(); //method, property 得到所有的public的fields,methods,properties
t.GetField("gender"); 根據名字得到某個field
Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差別