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

worldblog發表於2007-12-15
理解.NET中的CLR原理(二) (轉)[@more@]

理解中的CLR原理

:namespace prefix = o ns = "urn:schemas--com::office" />

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

 

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

1. 關於裝配件

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

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

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

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

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

獲取當前例項的 。

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

返回表示當前 Object 的 。

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

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

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

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. metadata和IDL的關係:

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

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

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

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

2. 從Attribute開始:

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

AttributeUsage(AttributeTargets.All)]


public class YarshrayAttribute : System.Attribute


{


 


 private string name;


  private int age;


  private bool sex;



   



  public  DeveloperAttribute(string name,int age,bool sex)


  {


  this.Name = name;


  this.Age = age;


 this.Sex = sex;


  }



   


 public virtual string Name



 get {return name;} 


 }



   


public virtual int Age


{


  get {return age;}


  }



   



  public virtual bool Sex


{


  get {return sex;}


  set {sex = value;}


  }


}


[YarshrayAttribute(“yarshray”,”21”,Sex=true;]


public class YarshrayTest


{


  public Yarshray()


{


  //nothing just make a test


}


}


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

Using System.Relection;

Using System;

Namespace yarshrayAPP{

public class yarshrayConsoleApp

{  

public  static void 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);

}

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993948/,如需轉載,請註明出處,否則將追究法律責任。

相關文章