C#反射Assembly 具體說明

1、對C#反射機制的理解
2、概念理解后,必須找到方法去完畢,給出管理的主要語法
3、終于給出有用的樣例,反射出來dll中的方法

反射是一個程序集發現及執行的過程,通過反射能夠得到*.exe或*.dll等程序集內部的信息。使用反射能夠看到一個程序集內部的接口、類、方法、字段、屬性、特性等等信息。在System.Reflection命名空間內包括多個反射經常使用的類,以下表格列出了經常使用的幾個類。
類型 作用
Assembly 通過此類能夠載入操縱一個程序集,并獲取程序集內部信息
EventInfo 該類保存給定的事件信息
FieldInfo 該類保存給定的字段信息
MethodInfo 該類保存給定的方法信息
MemberInfo 該類是一個基類,它定義了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多個公用行為
Module 該類能夠使你能訪問多個程序集中的給定模塊
ParameterInfo 該類保存給定的參數信息      
PropertyInfo 該類保存給定的屬性信息

一、System.Reflection.Assembly類
???? 通過Assembly能夠動態載入程序集,并查看程序集的內部信息,當中最經常使用的就是Load()這種方法。
???? Assembly assembly=Assembly.Load("MyAssembly");
???? 利用Assembly的object CreateInstance(string) 方法能夠反射創建一個對象,參數0為類名。
二、System.Type類
???? Type是最經常使用到的類,通過Type能夠得到一個類的內部信息,也能夠通過它反射創建一個對象。一般有三個經常使用的方法可得到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);
注意參數0是類名,參數1表示若找不到相應類時是否拋出異常,參數1表示類名是否區分大寫和小寫
?? 樣例:
?? 我們最常見的是利用反射與Activator結合來創建對象。
?? Assembly assembly= Assembly.Load("MyAssembly");
?? Type type=assembly.GetType("Example");
?? object obj=Activator.CreateInstance(type);
三、反射方法
??? 1.通過 System.Reflection.MethodInfo能查找到類里面的方法

Type type=typeof(Example);MethodInfo[] listMethodInfo=type.GetMethods();foreach(MethodInfo methodInfo in listMethodInfo)Cosole.WriteLine("Method name is "+methodInfo.Name);


2.我們也能通過反射方法運行類里面的方法2.我們也能通過反射方法運行類里面的方法

Assembly assembly= Assembly.Load("MyAssembly");Type type=assembly.GetType("Example");object obj=Activator.CreateInstance(type);MethodInfo methodInfo=type.GetMethod("Hello World");  //依據方法名獲取MethodInfo對象methodInfo.Invoke(obj,null);  //參數1類型為object[],代表Hello World方法的相應參數,輸入值為null代表沒有參數


四、反射屬性
?? 1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性
???? 經常使用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設置屬性值
四、反射屬性
?? 1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性
???? 經常使用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設置屬性值
四、反射屬性
?? 1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性
???? 經常使用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設置屬性值

Type type=typeof(Example);PropertyInfo[] listPropertyInfo=type.GetProperties();foreach(PropertyInfo propertyInfo in listPropertyInfo)Cosole.WriteLine("Property name is "+ propertyInfo.Name);


2.我們也能夠通過下面方法設置或者獲取一個對象的屬性值2.我們也能夠通過下面方法設置或者獲取一個對象的屬性值

 Assembly assembly=Assembly.Load("MyAssembly");Type type=assembly.GetType("Example");object obj=Activator.CreateInstance(type);PropertyInfo propertyInfo=obj.GetProperty("Name");    //獲取Name屬性對象var name=propertyInfo.GetValue(obj,null);                //獲取Name屬性的值PropertyInfo propertyInfo2=obj.GetProperty("Age");     //獲取Age屬性對象propertyInfo.SetValue(obj,34,null);                              //把Age屬性設置為34


五、反射字段
??? 通過 System.Reflection.FieldInfo 能查找到類里面的字段
??? 它包含有兩個經常用法SetValue(object ,object )和GetValue(object)? 由于用法與反射屬性很相似,在此不再多作介紹
?? (略)
六、反射特性
?? 通過System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一個類里面的特性,下面樣例能夠反射出一個類的全部特性
五、反射字段
??? 通過 System.Reflection.FieldInfo 能查找到類里面的字段
??? 它包含有兩個經常用法SetValue(object ,object )和GetValue(object)? 由于用法與反射屬性很相似,在此不再多作介紹
?? (略)
六、反射特性
?? 通過System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一個類里面的特性,下面樣例能夠反射出一個類的全部特性

Type type=typeof("Example");object[] typeAttributes=type.GetCustomAttributes(false);       //獲取Example類的特性foreach(object attribute in typeAttributes)Console.WriteLine("Attributes description is "+attribute.ToString());


通過以下樣例,能夠獲取Example類Name屬性的全部特性通過以下樣例,能夠獲取Example類Name屬性的全部特性

public class Example{[DataMemberAttribute]publics string Name{get;set;}..................}Type type = typeof(Example);        PropertyInfo propertyInfo=type.GetProperty("Name");    //獲取Example類的Name屬性foreach (object attribute in propertyInfo.GetCustomAttributes(false))        //遍歷Name屬性的全部特性Console.WriteLine(“Property attribute: "+attribute.ToString());

總結:

Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差別
在C#中,我們要使用反射,首先要搞清楚下面命名空間中幾個類的關系:
??? System.Reflection命名空間
??? (1)?? AppDomain:應用程序域,能夠將其理解為一組程序集的邏輯容器
??? (2)?? Assembly:程序集類
??? (3)?? Module:模塊類
??? (4)?? Type:使用反射得到類型信息的最核心的類
??? 他們之間是一種從屬關系,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,而一個Module能夠包括N個Type.

??? 1,Assembly.Load()
??? 這種方法通過程序集的長名稱(包含程序集名,版本號信息,語言文化,公鑰標記)來載入程序集的,會載入此程序集引用的其它程序集,普通情況下都應該優先使用 這種方法,他的運行效率比LoadFrom要高非常多,并且不會造成反復載入的問題(原因在第2點上說明)
??? 使用這種方法的時候, CLR會應用一定的策略來查找程序集,實際上CLR按例如以下的順序來定位程序集:
??? ⑴假設程序集有強名稱,在首先在全局程序集緩(GAC)中查找程序集。
??? ⑵假設程序集的強名稱沒有正確指定或GAC中找不到,那么通過配置文件里的<codebase>元素指定的URL來查找
??? ⑶假設沒有指定強名稱或是在GAC中找不到,CLR會探測特定的目錄:
??? 如果你的應用程序文件夾是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
??? 假設以上方法不能找到程序集,會發生編譯錯誤,假設是動態載入程序集,會在執行時拋出異常!
??? 2,Assembly.LoadFrom()
??? 這種方法從指定的路徑來載入程序集,實際上這種方法被調用的時候,CLR會打開這個文件,獲取當中的程序集版本號,語言文化,公鑰標記等信息,把他們傳遞給 Load方法,接著,Load方法採用上面的策略來查找程序集。假設找到了程序集,會和LoadFrom方法中指定的路徑做比較,假設路徑同樣,該程序集 會被覺得是應用程序的一部分,假設路徑不同或Load方法沒有找到程序集,那該程序集僅僅是被作為一個"數據文件"來載入,不會被覺得是應用程序的一部分。 這就是在第1點中提到的Load方法比LoadFrom方法的運行效率高的原因。另外,因為可能把程序集作為"數據文件"來載入,所以使用 LoadFrom從不同路徑載入同樣程序集的時候會導致反復載入。當然這種方法會載入此程序集引用的其它程序集。
??? 3,Assembly.LoadFile()
??? 這種方法是從指定的文件來載入程序集,和上面方法的不同之處是這種方法不會載入此程序集引用的其它程序集!
??? 結論:一般大家應該優先選擇Load方法來載入程序集,假設遇到須要使用LoadFrom方法的時候,最好改變設計而用Load方法來取代!
??? 另:Assembly.LoadFile 與 Assembly.LoadFrom的差別
??? 1、Assembly.LoadFile僅僅加載對應的dll文件,比方Assembly.LoadFile("abc.dll"),則加載abc.dll,假如abc.dll中引用了def.dll的話,def.dll并不會被加載。
??? Assembly.LoadFrom則不一樣,它會加載dll文件及其引用的其它dll,比方上面的樣例,def.dll也會被加載。
??? 2、用Assembly.LoadFrom加載一個Assembly時,會先檢查前面是否已經加載過同樣名字的Assembly,比方abc.dll有兩個版本號(版本號1在文件夾1下,版本號2放在文件夾2下),程序一開始時加載了版本號1,當使用Assembly.LoadFrom("2\\abc.dll")加載版本號2時,不能加載,而是返回版本號1.Assembly.LoadFile的話則不會做這種檢查,比方上面的樣例換成Assembly.LoadFile的話,則能正確加載版本號2.
??? LoadFile:載入指定路徑上的程序集文件的內容。LoadFrom: 依據程序集的文件名稱載入程序集文件的內容。
??? 差別:
??? LoadFile 方法用來來載入和檢查具有同樣標識但位于不同路徑中的程序集。但不會載入程序的依賴項。
??? LoadFrom 不能用于載入標識同樣但路徑不同的程序集。

?

總結:

Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差別
在C#中,我們要使用反射,首先要搞清楚下面命名空間中幾個類的關系:
??? System.Reflection命名空間
??? (1)?? AppDomain:應用程序域,能夠將其理解為一組程序集的邏輯容器
??? (2)?? Assembly:程序集類
??? (3)?? Module:模塊類
??? (4)?? Type:使用反射得到類型信息的最核心的類
??? 他們之間是一種從屬關系,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,而一個Module能夠包括N個Type.

??? 1,Assembly.Load()
??? 這種方法通過程序集的長名稱(包含程序集名,版本號信息,語言文化,公鑰標記)來載入程序集的,會載入此程序集引用的其它程序集,普通情況下都應該優先使用 這種方法,他的運行效率比LoadFrom要高非常多,并且不會造成反復載入的問題(原因在第2點上說明)
??? 使用這種方法的時候, CLR會應用一定的策略來查找程序集,實際上CLR按例如以下的順序來定位程序集:
??? ⑴假設程序集有強名稱,在首先在全局程序集緩(GAC)中查找程序集。
??? ⑵假設程序集的強名稱沒有正確指定或GAC中找不到,那么通過配置文件里的<codebase>元素指定的URL來查找
??? ⑶假設沒有指定強名稱或是在GAC中找不到,CLR會探測特定的目錄:
??? 如果你的應用程序文件夾是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
??? 假設以上方法不能找到程序集,會發生編譯錯誤,假設是動態載入程序集,會在執行時拋出異常!
??? 2,Assembly.LoadFrom()
??? 這種方法從指定的路徑來載入程序集,實際上這種方法被調用的時候,CLR會打開這個文件,獲取當中的程序集版本號,語言文化,公鑰標記等信息,把他們傳遞給 Load方法,接著,Load方法採用上面的策略來查找程序集。假設找到了程序集,會和LoadFrom方法中指定的路徑做比較,假設路徑同樣,該程序集 會被覺得是應用程序的一部分,假設路徑不同或Load方法沒有找到程序集,那該程序集僅僅是被作為一個"數據文件"來載入,不會被覺得是應用程序的一部分。 這就是在第1點中提到的Load方法比LoadFrom方法的運行效率高的原因。另外,因為可能把程序集作為"數據文件"來載入,所以使用 LoadFrom從不同路徑載入同樣程序集的時候會導致反復載入。當然這種方法會載入此程序集引用的其它程序集。
??? 3,Assembly.LoadFile()
??? 這種方法是從指定的文件來載入程序集,和上面方法的不同之處是這種方法不會載入此程序集引用的其它程序集!
??? 結論:一般大家應該優先選擇Load方法來載入程序集,假設遇到須要使用LoadFrom方法的時候,最好改變設計而用Load方法來取代!
??? 另:Assembly.LoadFile 與 Assembly.LoadFrom的差別
??? 1、Assembly.LoadFile僅僅加載對應的dll文件,比方Assembly.LoadFile("abc.dll"),則加載abc.dll,假如abc.dll中引用了def.dll的話,def.dll并不會被加載。
??? Assembly.LoadFrom則不一樣,它會加載dll文件及其引用的其它dll,比方上面的樣例,def.dll也會被加載。
??? 2、用Assembly.LoadFrom加載一個Assembly時,會先檢查前面是否已經加載過同樣名字的Assembly,比方abc.dll有兩個版本號(版本號1在文件夾1下,版本號2放在文件夾2下),程序一開始時加載了版本號1,當使用Assembly.LoadFrom("2\\abc.dll")加載版本號2時,不能加載,而是返回版本號1.Assembly.LoadFile的話則不會做這種檢查,比方上面的樣例換成Assembly.LoadFile的話,則能正確加載版本號2.
??? LoadFile:載入指定路徑上的程序集文件的內容。LoadFrom: 依據程序集的文件名稱載入程序集文件的內容。
??? 差別:
??? LoadFile 方法用來來載入和檢查具有同樣標識但位于不同路徑中的程序集。但不會載入程序的依賴項。
??? LoadFrom 不能用于載入標識同樣但路徑不同的程序集。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/hrhguanli/p/4074059.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376529.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

流媒體技術優化

文章目錄1、下載策略優化CDN選擇策略錯誤處理策略碼率選擇策略2、協議和架構優化HTTP2TCP變種擁塞控制QUIC架構流媒體協議的選擇與分發體系架構的設計對優化起著關鍵作用。 HLS和DASH協議在點播和OTT直播服務中已逐漸占據主流&#xff0c;其思想主要是將視頻轉為不同碼率并切為…

Android——android必看 各個控件屬性(網上看到的文字,覺得挺好的,珍藏了)...

屬性 值 說明 Android:orientation horizontal/vertical 設置布局水平還是垂直&#xff0c;默認是垂直 android:checked true/false 標記默認選中&#xff0c;如果是單選則選中最后一個 android:layout_gravity center/right/left/bottom/top 位置 android:gravity…

java中接口的定義與實現

1、定義接口 使用interface來定義一個接口。接口定義同類的定義類似&#xff0c;也是分為接口的聲明和接口體&#xff0c;當中接口體由常量定義和方法定義兩部分組成。定義接口的基本格式例如以下&#xff1a; [修飾符] interface 接口名 [extends 父接口名列表]{ [public] …

API設計筆記:pimpl技巧

pimpl pointer to implementation&#xff1a;指向實現的指針&#xff0c;使用該技巧可以避免在頭文件暴露私有細節&#xff0c;可以促進API接口和實現保持完全分離。 Pimpl可以將類的數據成員定義為指向某個已經聲明過的類型的指針&#xff0c;這里的類型僅僅作為名字引入&am…

C++必讀書

C必讀書 《Inside The C Object Model》 《Effective C》和《More Effective C》以及《Exceptional C》 《C面向對象高效編程(C Effective Object-Oriented Software Construction)》 《面向對象軟件構造(Object-Oriented Software Construction)》 《設計模式(Design Patterns…

python socket編程實現的簡單tcp迭代server

與c/c socket編程對照見http://blog.csdn.net/aspnet_lyc/article/details/38946915 server&#xff1a; import socketPORT 9999 BACKLOG 5 MAXLINE 1024listenfd socket.socket(socket.AF_INET,socket.SOCK_STREAM) listenfd.bind((,PORT)) listenfd.listen(BACKLOG)w…

API設計筆記:抽象基類、工廠方法、擴展工廠

文章目錄抽象基類、工廠方法擴展工廠抽象基類、工廠方法 renderer.h #ifndef UNTITLED_RENDERER_H #define UNTITLED_RENDERER_H#include <string> class IRenderer { public:virtual ~IRenderer() {}virtual bool func1(const std::string& filename) 0;virtual …

《設計模式》-責任鏈模式

責任鏈模式是一種對象的行為模式【GOF95】。在責任鏈模式里&#xff0c;很多對象由每一個對象對其下家的用而鏈起來形成一條鏈&#xff0c;請求在這個鏈上傳遞&#xff0c;直到鏈上的某一個對象決定處理此請求。 發出請求的客戶端并不知道鏈上的哪一個對象終處理這個請求&#…

ASPX的Timer位置沒放正確,導致整頁刷新,而不是UpdatePanel里的內容刷新。

提示&#xff1a;Timer應該放在UpdatePanel的ContentTemplate標簽里&#xff0c;才行。放在外面的話&#xff0c;會導致整頁刷新。轉載于:https://www.cnblogs.com/xxxteam/p/3209522.html

高性能隨機數:mt19937、uniform_int_distribution使用

// 例如要隨機獲取一個vector中的元素 // 先對vector nums進行插入數據 .... // 使用高性能隨機數 mt19937 gen; // mt19937頭文件是<random> 是偽隨機數產生器&#xff0c;用于產生高性能的隨機數 uniform_int_distribution<int> dis(0, nums.size() - 1); //uni…

【機器學習】EM最大期望算法

EM, ExpectationMaximization Algorithm, 期望最大化算法。一種迭代算法&#xff0c;用于含有隱變量(hidden variable)的概率參數模型的最大似然估計或極大后驗概率估計&#xff0c;其概率模型依賴于無法觀測的隱變量。 經常用在ML與計算機視覺的數據聚類領域。 EM應用&#xf…

ModuleNotFoundError: No module named ‘_ctypes‘報錯解決

1、python3的安裝與卸載 先刪除現有的python3 https://codeantenna.com/a/Ys0TCtmqIJ 2、關于ctypes的報錯問題解決 安裝庫后&#xff0c;重新編譯python ModuleNotFoundError: No module named _ctypeshttps://www.jianshu.com/p/69681655309b 問題解決

做一個給自己手機免費發送“天氣預報”信息的軟件

實現一個以下截圖這樣的功能&#xff01;沒錯&#xff0c;就是你手機可以收到“免費”的天氣預報短信&#xff01; 一、在做之前必須了解以下四個功能&#xff1a; 1、WebService 2、Quartz.Net&#xff08;定時任務框架&#xff09; 3、SMTP&#xff1a;簡單郵件傳輸協議,它是…

《拾牙慧者博客檢索指南》

本指南主要概括一下我的博客所涉及到的一些方面&#xff0c;以及給出每個專欄的索引&#xff0c;方便以后自己以及他人的查找相關文章。 專欄總覽《春秋招面經》《基礎技術棧》《數據庫學習筆記》《嵌入式編程經驗》《圖像處理與計算機視覺經驗》《機器學習筆記與數學》《算法與…

Android_Chronometer計時器

最近做一個項目用到Handler 和Message &#xff0c;開始時不是很明白&#xff0c;不了解其中的內部機制&#xff0c;所以開發起來有點難度&#xff0c;之后自己找了Android 時間服務 這一節的內容&#xff0c;總結了一點關于時間的知識&#xff0c;在這里大概寫一下&#xff0c…

補碼

3&#xff0e;經常使用數值編碼 因為機器數在計算時&#xff0c;假設符號位和數值位同一時候參與運算&#xff0c;則可能會產生錯誤結果&#xff1b;而假設單獨考慮符號問題&#xff0c;又會添加運算器件的實現難度。因此&#xff0c;為了使計算機可以方便地對數值進行各種算術…

置頂 | wolai博客

最近用wolai記錄筆記較多&#xff0c;這里放一下我wolai的地址&#xff0c;當然csdn這邊也會同時更文。 hanhan的博客

深入研究Clang(四) Clang編譯器的簡單分析

作者&#xff1a;史寧寧&#xff08;snsn1984&#xff09;首先我們確定下Clang編譯器的具體內容和涵蓋范圍。之前在《LLVM每日談之二十 Everything && Clang driver 》中曾經提到過&#xff0c;Clang driver&#xff08;命令行表示是clang&#xff09;和Clang前端&…

Expression Trees 參數簡化查詢

ASP.NET MVC 引入了 ModelBinder 技術&#xff0c;讓我們可以在 Action 中以強類型參數的形式接收 Request 中的數據&#xff0c;極大的方便了我們的編程&#xff0c;提高了生產力。在查詢 Action 中&#xff0c;我們可以將 Expression Trees 用作參數&#xff0c;通過自定義的…

為你的程序添加監聽器

平時在寫程序時經常會遇到監聽器&#xff0c;比如按鈕的click監聽器&#xff0c;按鍵監聽器等等。而android中的監聽器和java中的回調函數是同一個概念&#xff0c;都是在底層代碼中定義一個接口來調用高層的代碼。那么什么是回調函數呢&#xff1f;網上說的是“在WINDOWS中&am…