今天主要討論程式集和反射的用方法
程式集:
程式集元素局包括Win32檔案首部、CLR檔案首部和資訊清單
Win32檔案首部
01. 使程式集可以被Windows作業系統載入和操作
02. 標識應用程式在Windows作業系統中的類型(是控制台,圖形介面還是web頁面)
03. 使用dumpbin.exe工具和 /headers標記瀏覽程式集的Win32檔案首部資訊
例如:dumpbin Test.exe /headers
CLR檔案首部
其定義了多個標記,使得運行庫瞭解託管檔案的布局
使用dumpin.exe工具和/clrheader標記瀏覽程式集內部的CLR首部資訊
資訊清單
清單是用來描述程式集中元素的相互關係以及程式集正常工作時需要依賴其他哪些程式集的中繼資料
CIL代碼
運行中,程式集內部的CIL代碼被編譯為指平台和CPU的指令
類型中繼資料:
完整描述程式集內含類型和引用外部類型的格式
程式集資源
程式集資源指定的.NET程式集可以包含一些嵌入資源,表,映像和聲音等。
程式集可以是dll檔案,也可是是EXE檔案
構建和使用程式集
案例:構建程式集,並且使用該程式集
01,我們建立一個Ctop類庫項目,在該類庫項目中包含StrToPinyin類,類中有一個GetChineseSpell方法,方法原型如下:
02,建立一個WinForm應用程式LibraryTest來引用該程式集
引用步驟:首先右鍵添加引用
然後通過using Ctop引入對應的程式集。
03,在txtChinese的KeyUp事件中編寫如下代碼
這樣我們就實現了對程式集中方法的調用。
反編譯查看程式的資訊
常見標記的含義:
共用組件
共用組件是類型和資源的結合,如果我們需要一個機器層級的類庫,就應該將其部署為共用組件。在部署共用組件到GAC之前,必須為其賦予一個強式名稱。
強式名稱:
強式名稱是由程式集的標識加上公開金鑰和數位簽章組成的,其中,程式集的標識包括簡單文本名稱、版本號碼和地區性資訊(如果提供的話)。它使用對應的私密金鑰從組件檔中產生。(組件檔包含資訊清單,其中包含組成程式集的所有檔案的名稱和雜湊。)
具有強式名稱的程式集只能使用其他具有強式名稱的程式集的類型。否則將會危及到該具有強式名稱的程式集的安全。
為程式集設定強式名稱:
反射的定義:
反射(Reflection)是.NET中的重要機制,通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委託、介面和枚舉等)的成員,包括方法、屬性、事件,以及建構函式等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型了如指掌。如果獲得了建構函式的資訊,即可直接建立對象,即使這個對象的類型在編譯時間還不知道。
反射的機制
通過Assembly類擷取該程式集下所有的模組,然後擷取對應模組下的類型,然後擷取該類型下對應的方法、屬性和事件等。具體代碼如下:
Assembly assembly= Assembly.LoadFrom(@"F:\ASP.NET學習開始\多線程\CSharp基礎\Ctop\bin\Debug\Ctop.dll");
Module[] modules = assembly.GetModules();
foreach (Module module in modules)
{
Type[] types = module.GetTypes();
foreach (Type type in types)
{
Console.WriteLine(type.Name);
//反射出對應類型下的所有方法
MethodInfo[] methodInfos = type.GetMethods();
foreach (MethodInfo methodInfo in methodInfos)
{
Console.WriteLine(methodInfo.Name);
}
Console.WriteLine("method==============");
}
Console.WriteLine("============");
}
Console.ReadKey();
好了,對程式集和反射的內容先介紹到這裡。