C#反射Assembly 具体说明
1、對C#反射機制的理解
2、概念理解后,必須找到方法去完畢,給出管理的主要語法
3、終于給出有用的樣例,反射出來dll中的方法
反射是一個程序集發(fā)現(xiàn)及執(zhí)行的過程,通過反射能夠得到*.exe或*.dll等程序集內(nèi)部的信息。使用反射能夠看到一個程序集內(nèi)部的接口、類、方法、字段、屬性、特性等等信息。在System.Reflection命名空間內(nèi)包括多個反射經(jīng)常使用的類,以下表格列出了經(jīng)常使用的幾個類。
類型 作用
Assembly 通過此類能夠載入操縱一個程序集,并獲取程序集內(nèi)部信息
EventInfo 該類保存給定的事件信息
FieldInfo 該類保存給定的字段信息
MethodInfo 該類保存給定的方法信息
MemberInfo 該類是一個基類,它定義了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多個公用行為
Module 該類能夠使你能訪問多個程序集中的給定模塊
ParameterInfo 該類保存給定的參數(shù)信息
PropertyInfo 該類保存給定的屬性信息
一、System.Reflection.Assembly類
???? 通過Assembly能夠動態(tài)載入程序集,并查看程序集的內(nèi)部信息,當中最經(jīng)常使用的就是Load()這種方法。
???? Assembly assembly=Assembly.Load("MyAssembly");
???? 利用Assembly的object CreateInstance(string) 方法能夠反射創(chuàng)建一個對象,參數(shù)0為類名。
二、System.Type類
???? Type是最經(jīng)常使用到的類,通過Type能夠得到一個類的內(nèi)部信息,也能夠通過它反射創(chuàng)建一個對象。一般有三個經(jīng)常使用的方法可得到Type對象。
利用typeof() 得到Type對象
Type type=typeof(Example);
利用System.Object.GetType() 得到Type對象
Example example=new Example();
Type type=example.GetType();
利用System.Type.GetType() 得到Type對象
Type type=Type.GetType("MyAssembly.Example",false,true);
注意參數(shù)0是類名,參數(shù)1表示若找不到相應(yīng)類時是否拋出異常,參數(shù)1表示類名是否區(qū)分大寫和小寫
?? 樣例:
?? 我們最常見的是利用反射與Activator結(jié)合來創(chuàng)建對象。
?? Assembly assembly= Assembly.Load("MyAssembly");
?? Type type=assembly.GetType("Example");
?? object obj=Activator.CreateInstance(type);
三、反射方法
??? 1.通過 System.Reflection.MethodInfo能查找到類里面的方法
2.我們也能通過反射方法運行類里面的方法2.我們也能通過反射方法運行類里面的方法
四、反射屬性
?? 1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性
???? 經(jīng)常使用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設(shè)置屬性值
四、反射屬性
?? 1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性
???? 經(jīng)常使用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設(shè)置屬性值
四、反射屬性
?? 1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性
???? 經(jīng)常使用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設(shè)置屬性值
2.我們也能夠通過下面方法設(shè)置或者獲取一個對象的屬性值2.我們也能夠通過下面方法設(shè)置或者獲取一個對象的屬性值
五、反射字段
??? 通過 System.Reflection.FieldInfo 能查找到類里面的字段
??? 它包含有兩個經(jīng)常用法SetValue(object ,object )和GetValue(object)? 由于用法與反射屬性很相似,在此不再多作介紹
?? (略)
六、反射特性
?? 通過System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一個類里面的特性,下面樣例能夠反射出一個類的全部特性
五、反射字段
??? 通過 System.Reflection.FieldInfo 能查找到類里面的字段
??? 它包含有兩個經(jīng)常用法SetValue(object ,object )和GetValue(object)? 由于用法與反射屬性很相似,在此不再多作介紹
?? (略)
六、反射特性
?? 通過System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一個類里面的特性,下面樣例能夠反射出一個類的全部特性
通過以下樣例,能夠獲取Example類Name屬性的全部特性通過以下樣例,能夠獲取Example類Name屬性的全部特性
總結(jié):
Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差別
在C#中,我們要使用反射,首先要搞清楚下面命名空間中幾個類的關(guān)系:
??? System.Reflection命名空間
??? (1)?? AppDomain:應(yīng)用程序域,能夠?qū)⑵淅斫鉃橐唤M程序集的邏輯容器
??? (2)?? Assembly:程序集類
??? (3)?? Module:模塊類
??? (4)?? Type:使用反射得到類型信息的最核心的類
??? 他們之間是一種從屬關(guān)系,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,而一個Module能夠包括N個Type.
??? 1,Assembly.Load()
??? 這種方法通過程序集的長名稱(包含程序集名,版本號信息,語言文化,公鑰標記)來載入程序集的,會載入此程序集引用的其它程序集,普通情況下都應(yīng)該優(yōu)先使用 這種方法,他的運行效率比LoadFrom要高非常多,并且不會造成反復(fù)載入的問題(原因在第2點上說明)
??? 使用這種方法的時候, CLR會應(yīng)用一定的策略來查找程序集,實際上CLR按例如以下的順序來定位程序集:
??? ⑴假設(shè)程序集有強名稱,在首先在全局程序集緩(GAC)中查找程序集。
??? ⑵假設(shè)程序集的強名稱沒有正確指定或GAC中找不到,那么通過配置文件里的<codebase>元素指定的URL來查找
??? ⑶假設(shè)沒有指定強名稱或是在GAC中找不到,CLR會探測特定的目錄:
??? 如果你的應(yīng)用程序文件夾是C:\AppDir,<probing>元素中的privatePath指定了一個路徑Path1,你要定位的程序集是AssemblyName.dll則CLR將依照例如以下順序定位程序集
??? C:\AppDir\AssemblyName.dll
??? C:\AppDir\AssemblyName\AssemblyName.dll
??? C:\AppDir\Path1\AssemblyName.dll
??? C:\AppDir\Path1\AssemblyName\AssemblyName.dll
??? 假設(shè)以上方法不能找到程序集,會發(fā)生編譯錯誤,假設(shè)是動態(tài)載入程序集,會在執(zhí)行時拋出異常!
??? 2,Assembly.LoadFrom()
??? 這種方法從指定的路徑來載入程序集,實際上這種方法被調(diào)用的時候,CLR會打開這個文件,獲取當中的程序集版本號,語言文化,公鑰標記等信息,把他們傳遞給 Load方法,接著,Load方法採用上面的策略來查找程序集。假設(shè)找到了程序集,會和LoadFrom方法中指定的路徑做比較,假設(shè)路徑同樣,該程序集 會被覺得是應(yīng)用程序的一部分,假設(shè)路徑不同或Load方法沒有找到程序集,那該程序集僅僅是被作為一個"數(shù)據(jù)文件"來載入,不會被覺得是應(yīng)用程序的一部分。 這就是在第1點中提到的Load方法比LoadFrom方法的運行效率高的原因。另外,因為可能把程序集作為"數(shù)據(jù)文件"來載入,所以使用 LoadFrom從不同路徑載入同樣程序集的時候會導(dǎo)致反復(fù)載入。當然這種方法會載入此程序集引用的其它程序集。
??? 3,Assembly.LoadFile()
??? 這種方法是從指定的文件來載入程序集,和上面方法的不同之處是這種方法不會載入此程序集引用的其它程序集!
??? 結(jié)論:一般大家應(yīng)該優(yōu)先選擇Load方法來載入程序集,假設(shè)遇到須要使用LoadFrom方法的時候,最好改變設(shè)計而用Load方法來取代!
??? 另:Assembly.LoadFile 與 Assembly.LoadFrom的差別
??? 1、Assembly.LoadFile僅僅加載對應(yīng)的dll文件,比方Assembly.LoadFile("abc.dll"),則加載abc.dll,假如abc.dll中引用了def.dll的話,def.dll并不會被加載。
??? Assembly.LoadFrom則不一樣,它會加載dll文件及其引用的其它dll,比方上面的樣例,def.dll也會被加載。
??? 2、用Assembly.LoadFrom加載一個Assembly時,會先檢查前面是否已經(jīng)加載過同樣名字的Assembly,比方abc.dll有兩個版本號(版本號1在文件夾1下,版本號2放在文件夾2下),程序一開始時加載了版本號1,當使用Assembly.LoadFrom("2\\abc.dll")加載版本號2時,不能加載,而是返回版本號1.Assembly.LoadFile的話則不會做這種檢查,比方上面的樣例換成Assembly.LoadFile的話,則能正確加載版本號2.
??? LoadFile:載入指定路徑上的程序集文件的內(nèi)容。LoadFrom: 依據(jù)程序集的文件名稱載入程序集文件的內(nèi)容。
??? 差別:
??? LoadFile 方法用來來載入和檢查具有同樣標識但位于不同路徑中的程序集。但不會載入程序的依賴項。
??? LoadFrom 不能用于載入標識同樣但路徑不同的程序集。
?
總結(jié):
Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差別
在C#中,我們要使用反射,首先要搞清楚下面命名空間中幾個類的關(guān)系:
??? System.Reflection命名空間
??? (1)?? AppDomain:應(yīng)用程序域,能夠?qū)⑵淅斫鉃橐唤M程序集的邏輯容器
??? (2)?? Assembly:程序集類
??? (3)?? Module:模塊類
??? (4)?? Type:使用反射得到類型信息的最核心的類
??? 他們之間是一種從屬關(guān)系,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,而一個Module能夠包括N個Type.
??? 1,Assembly.Load()
??? 這種方法通過程序集的長名稱(包含程序集名,版本號信息,語言文化,公鑰標記)來載入程序集的,會載入此程序集引用的其它程序集,普通情況下都應(yīng)該優(yōu)先使用 這種方法,他的運行效率比LoadFrom要高非常多,并且不會造成反復(fù)載入的問題(原因在第2點上說明)
??? 使用這種方法的時候, CLR會應(yīng)用一定的策略來查找程序集,實際上CLR按例如以下的順序來定位程序集:
??? ⑴假設(shè)程序集有強名稱,在首先在全局程序集緩(GAC)中查找程序集。
??? ⑵假設(shè)程序集的強名稱沒有正確指定或GAC中找不到,那么通過配置文件里的<codebase>元素指定的URL來查找
??? ⑶假設(shè)沒有指定強名稱或是在GAC中找不到,CLR會探測特定的目錄:
??? 如果你的應(yīng)用程序文件夾是C:\AppDir,<probing>元素中的privatePath指定了一個路徑Path1,你要定位的程序集是AssemblyName.dll則CLR將依照例如以下順序定位程序集
??? C:\AppDir\AssemblyName.dll
??? C:\AppDir\AssemblyName\AssemblyName.dll
??? C:\AppDir\Path1\AssemblyName.dll
??? C:\AppDir\Path1\AssemblyName\AssemblyName.dll
??? 假設(shè)以上方法不能找到程序集,會發(fā)生編譯錯誤,假設(shè)是動態(tài)載入程序集,會在執(zhí)行時拋出異常!
??? 2,Assembly.LoadFrom()
??? 這種方法從指定的路徑來載入程序集,實際上這種方法被調(diào)用的時候,CLR會打開這個文件,獲取當中的程序集版本號,語言文化,公鑰標記等信息,把他們傳遞給 Load方法,接著,Load方法採用上面的策略來查找程序集。假設(shè)找到了程序集,會和LoadFrom方法中指定的路徑做比較,假設(shè)路徑同樣,該程序集 會被覺得是應(yīng)用程序的一部分,假設(shè)路徑不同或Load方法沒有找到程序集,那該程序集僅僅是被作為一個"數(shù)據(jù)文件"來載入,不會被覺得是應(yīng)用程序的一部分。 這就是在第1點中提到的Load方法比LoadFrom方法的運行效率高的原因。另外,因為可能把程序集作為"數(shù)據(jù)文件"來載入,所以使用 LoadFrom從不同路徑載入同樣程序集的時候會導(dǎo)致反復(fù)載入。當然這種方法會載入此程序集引用的其它程序集。
??? 3,Assembly.LoadFile()
??? 這種方法是從指定的文件來載入程序集,和上面方法的不同之處是這種方法不會載入此程序集引用的其它程序集!
??? 結(jié)論:一般大家應(yīng)該優(yōu)先選擇Load方法來載入程序集,假設(shè)遇到須要使用LoadFrom方法的時候,最好改變設(shè)計而用Load方法來取代!
??? 另:Assembly.LoadFile 與 Assembly.LoadFrom的差別
??? 1、Assembly.LoadFile僅僅加載對應(yīng)的dll文件,比方Assembly.LoadFile("abc.dll"),則加載abc.dll,假如abc.dll中引用了def.dll的話,def.dll并不會被加載。
??? Assembly.LoadFrom則不一樣,它會加載dll文件及其引用的其它dll,比方上面的樣例,def.dll也會被加載。
??? 2、用Assembly.LoadFrom加載一個Assembly時,會先檢查前面是否已經(jīng)加載過同樣名字的Assembly,比方abc.dll有兩個版本號(版本號1在文件夾1下,版本號2放在文件夾2下),程序一開始時加載了版本號1,當使用Assembly.LoadFrom("2\\abc.dll")加載版本號2時,不能加載,而是返回版本號1.Assembly.LoadFile的話則不會做這種檢查,比方上面的樣例換成Assembly.LoadFile的話,則能正確加載版本號2.
??? LoadFile:載入指定路徑上的程序集文件的內(nèi)容。LoadFrom: 依據(jù)程序集的文件名稱載入程序集文件的內(nèi)容。
??? 差別:
??? LoadFile 方法用來來載入和檢查具有同樣標識但位于不同路徑中的程序集。但不會載入程序的依賴項。
??? LoadFrom 不能用于載入標識同樣但路徑不同的程序集。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hrhguanli/p/4074059.html
總結(jié)
以上是生活随笔為你收集整理的C#反射Assembly 具体说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问下,褚橙是哪里的特产啊?
- 下一篇: python socket编程实现的简单