[C#]C#學習筆記-CIL和動態程式集

來源:互聯網
上載者:User

C#學習筆記-CIL和動態程式集

羅朝輝(http://www.cnblogs.com/kesalin/)

《C#與.NET進階程式設計》讀書筆記

 

1,System.Reflection.Emit 命名空間提供了很多在運行時能夠在記憶體中產生.NET程式集的類型,在記憶體中定義和執行程式集的正式術語是動態程式集(dynamic assembly)。我們使用專有的 CIL(通用中間語言)指令集來動態構建程式集。

2,CIL 本質上就是.NET平台的母語,當我們選擇某種託管的程式設計語言(C#,VB,COBOL.NET等)構建.NET程式集時,同這個語言相關的編譯器就會把原始碼翻譯成CIL。我們可以直接使用.NET Framework SDK提供的 CIL 和 CIL編譯器(ilasm.exe)來開發和構建.NET程式集,雖然通常我們很少這麼做。這麼說把CIL對應.NET開發人員就好比組合語言對於一個C++程式員一樣。

3,CIL定義了一組通用的關鍵字,這些關鍵字可以分為三個類別:CIL指令,CIL特性和CIL作業碼。
CIL指令用於描述.NET程式集總體結構,它用於通知CIL編譯器如何定義在程式集用到的命名空間,類型和成員。CIL指令文法上使用一個(.)的首碼來表示,如:.namespace, .class, .publickeytoken, .method, .assembly等。
CIL特性可以限定應該如何處理一個 CIL 指令。例如:一個.class指令可以同public特性(明確類的可見度),extends特性(明確類的基類)和 implements特性(明確類支援的介面)相結合。
CIL作業碼提供類的實現邏輯。如:ldstr(轉載字串),box,unbox,throw,sizeof等。

4,CIL是一個完全以棧為基礎的開發語言,在CIL中用來負責這個棧實現的部分叫做虛擬執行棧。將作業碼壓入這個棧的過程叫做載入(Load),將作業碼從棧頂移到記憶體中(如局部變數)的過程叫做儲存(store)。 CIL不允許直接存取一個資料,包括局部變數,方法中傳入的變數或者類型的欄位資料。為了實現訪問,必須顯式地載入資料到棧中,並在使用時彈出。

5,正反向工程:可以使用ildasm.exe將程式集的CIL代碼匯出到外部檔案,有了CIL代碼也可以使用CIL編譯器ilasm.exe重新編譯。正反向工程讓我們能夠修改一個沒有原始碼的程式集,也可以補充可與COM互操作的程式集在在裝換過程中丟失的IDL特性。

6,動態程式集在運行中通過使用 System.Reflection.Emit命名空間提供的類型在記憶體中建立,System.Reflection.Emit 命名空間使得在運行時建立程式集及其模組,類型定義以及CIL實現邏輯成為可能。一旦完成了這些,就可以將記憶體中的二進位程式儲存到磁碟上產生一個新的靜態程式集。儘管建立動態程式集不是很常見,但在如下一些場合這個技術還是非常有用:第一,構建需要根據使用者的輸入來產生組件檔的.NET開發工具;第二,構建需要在運行時通過中繼資料來產生遠程類型的代理的程式;第三,希望載入靜態程式集並能夠動態地插入新的類型到二進位鏡像中。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.