圖解DotNet框架之一:編譯與執行引擎(上)

      (聲明:本系列只想給大家介紹.net框架,並不是語法和類的使用的講解,所以只能概括的描述一下所提到的類,如果有疑問可以到MSDN上面去查)    

 

衆所周知,DotNet框架是非常龐大的,光項目創建時的種類就有WPF,WCF,WF這三種最新的技術,還有以前的Web,WinForm,Service,Mobile等等.
這麼複雜和龐大的框架,用文字來描述是遠遠不夠的,所以我準備寫一系列圖文並茂的文章,把我所知道的所有Net框架中的東西全部串聯起來,希望可以給大家一個DotNet框架的知識圖,本人能力有限,難免有理解錯誤和表達不清的地方,望大家諒解並指教.        
      好,我們現在就開始第一張圖的學習,再所有的文章寫完後,大家將會得到一個完整的框架圖。

    

 

下面我會做出對這個圖的解釋,請大家對照圖來一步一步的學習。

1.CTS  和 CLS :

    CTS:公共類型系統。他是一個集合{類,接口,委託,結構,枚舉,類型成員,基本數據類型},只有符合CTS的類型才能在CLR上運行。簡單點說就是VB,C#,C++等DotNet支持的語言的類型集合。這些東西大部分都定義在System.dll中,我們將在下一篇來討論system.dll。
    CLS:公共語言規範。從圖上可以看出,他是CTS的子集,爲什麼他是子集呢?因爲在C#中有Ulong而VB中就沒有。看以下代碼

    public class Test
    
{
        
public ulong Add(ulong a, ulong b)  //如果某語言特有的類型,作爲返回類型和參數則不遵循CLS
        {
            
return a + b;
        }

        
public int Add(int a, int b)   //但是作爲局部變量則仍然遵循CLS
        {
            
ulong x;
            
return a + b;
        }
 
    }


    在默認.NET開發平臺上是不會執行CLS檢查的,如果要開啓可以在AssemblyInfo.cs中加入代碼

[assembly:System.CLSCompliant(true)]

大家可能要問,爲什麼要遵循CLS呢?答案在後面給出。

2. CIL,元數據和程序集清單

     CIL:公共中間語言。我們大家都知道,在.Net中使用VB寫一個DLL,那麼在C#的項目中也可以調用,反之亦然。如何實現的呢?就是CIL了,前面我們說過CLS的作用,並且留下了爲什麼要遵守CLS的疑問,就是因爲.net編譯生成的dll或Exe,其實主要是CIL,原數據和程序集清單這三部分組成。那麼要想VB和C#共享,就要有一個通用的規範,它就是CLS了,呵呵,現在明白爲什麼要CLS了吧,如果你不去遵守CLS也是可以的,但是就不能保證你的dll的複用性了。
    元數據:.net的反射,遠程處理,序列化這些東西都很神祕吧,其實他們都是原數據的功勞,你所定義的類,方法,方法的返回類型和參數,屬性,字段,都會被編譯成元數據,然後當你序列化或反射時,拿這些原數據給你生成一個類。
    程序集清單:這個就容易理解了,你添加的dll引用的信息全都在這裏。下面是一個Dll中的信息。

    原代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
        }

    }

    
public class Test
    
{
        
public ulong Add(ulong a, ulong b)  //如果某語言特有的類型,作爲返回類型和參數則不遵循CLS
        {
            
return a + b;
        }

        
public int Add(int a, int b)   //但是作爲局部變量則仍然遵循CLS
        {
            
ulong x;
            
return a + b;
        }

    }

}

    使用.Net自帶的 ILDisassembler.exe 察看的IL: 

.class public auto ansi beforefieldinit ConsoleApplication3.Test
       extends [mscorlib]System.Object
{
 .method 
public hidebysig instance int32 
          Add(int32 a,
              int32 b) cil managed
  
{
    
// Code size       4 (0x4)
    .maxstack  8
    IL_0000:  ldarg.
1
    IL_0001:  ldarg.
2
    IL_0002:  add
    IL_0003:  ret
  }
 // end of method Test::Add
}


    就是這三樣東西組成的dll,讓.net實現了遠程處理的remoting,反射,序列化和跨平臺,跨語言。關於跨平臺的問題,我們在下一篇討論。。


       下一篇:  .NET 框架與架構模式和設計模式詳解系列(圖解DotNet框架)之一:.Net基礎,編譯與執行引擎(下)

 

 

發佈了26 篇原創文章 · 獲贊 3 · 訪問量 6697
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章