理解.NET中的CLR原理(二)

yarshray發表於2020-04-05

理解.NET中的CLR原理

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

作者:yarshray saga join(如要轉載請附上作者,謝謝!)

 

*我們手中的零件              ——— Assembly (裝配件)

1 關於裝配件

*讓我們在同一個系統中執行    ——— CTS (通用型別系統)

1 先來談談System.Object ———  一切NET的根源

CTS中的所有類全部都是從System.Object物件派生而來。它提供了基本的操作如下:

 

Equals

已過載。確定兩個 Object 例項是否相等。

GetHashCode

用作特定型別的雜湊函式,適合在雜湊演算法和資料結構(如雜湊表)中使用。

GetType

獲取當前例項的 Type

ReferenceEquals

確定指定的 Object 例項是否是相同的例項。

ToString

返回表示當前 ObjectString

 

另外CTS還定義了一組跨語言的物件。大多數編譯器都提供這些物件的別名。這裡以C#為例說明:

object ,int ,string,sbyte,byte,short,long,float,char,double,bool decimal.

 

以下兩個論題,由於我在論壇中答了太多遍,如果你有興趣可以去CSDNC#版去搜尋,會找到很多,基本我都參與了。因此,這裡我只放連線。

2 值型別和引用型別

引用型別參考:

ms-help://MS.VSCC/MS.MSDNVS.2052/csref/html/vcrefreferencetypes.htm

值型別參考:

ms-help://MS.VSCC/MS.MSDNVS.2052/csref/html/vcrefvaluetypes.htm

 

3 不要把boxing and unboxing 和型別轉換混淆

 

參考:

ms-help://MS.VSCC/MS.MSDNVS.2052/csref/html/vclrfboxingunboxingpg.htm

*宇宙大爆炸後的產物          ——— metadata (後設資料)

1 metadataIDL的關係:

後設資料描述了程式碼中的資料型別等一些通用語言執行時(Common Language Runtime)需要在程式碼執行時知道的資訊。後設資料使得.NET應用程式程式碼具備自描述特性,提供了型別安全保障,這在以前需要額外的型別庫或介面定義語言(Interface Definition Language,簡稱IDL)。如果,你以前有做過COM那麼你一定知道,在COM要獲取Metadata必須要從登錄檔中訪問。

 

後設資料是元件物件模型中關於PE的資訊, 後設資料之間是通過非標準型別的庫通訊的. .NET,這些資料包含在目標檔案格式中,包括與目標檔案格式相匹配的PE以及某些確定的指導方針;他所包含的資訊像彙編的名字,版本號,語言外部的形式用作參考註釋, 內部形式也很透明,清楚的闡明瞭使用的方法,引用的函式,類等等。

 
通用計算機語言(CLR)使用後設資料是有專用目的的。安全性是由一個公用的祕鑰在PE的標頭檔案中管理的. CLR可以知道一些關於類和模組的資訊, 如果需要的話甚至結構的資訊也可以掌握。

  CLR
中類裝載器的元件也使用後設資料載彙編中定位特殊的類,本地的或者網路間的均可。 Just-in-time (JIT) 也使用了後設資料來把媒介語言(IL)轉換成可執行的程式碼。一些其他的程式也同樣在使用後設資料時受益匪淺。這裡有一個很普遍的在Windows 2000下使用Word 文件的例子。如果這個文件檔案已經完成了內容,作者,標題,或者其他的一些後設資料, 他的文字內容會像工具註釋一樣的顯示出來,當使用者揮動著滑鼠到這個文字檔案圖示的上方時。你可以使用Ildasm.exe 的功能來看PE庫中的後設資料。

 

2 Attribute開始:

後設資料的產生就是從Attribute開始,的,與COM不同的是。NET中的屬性可以自己定義。所有。NET中的Attribute均是從System.Attribute派生的。那麼我們就可以建立自己的描述資訊。加以管理,如下;

 

 

 

 

 

 

下面我們來使用上面的後設資料:

Using System.Relection;

Using System;

Namespace yarshrayAPP{

public class yarshrayConsoleApp

{  

 

public  static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()

{

MemberInfor om;

om=typeof(YarshrayTest);

object o;

o=om.GetCustomAttribute(typeof(Yarshray),true);

YarshrayAttribute ya=( YarshrayAttribute)o;

Console.WriteLine(“name:”+ys.Name);

Console.WriteLine(“Age:”+ys.Age);

Console.WriteLine(“Sex:”+ys.Sex);

}

}

 

相關文章