學習CLR Via C 的一些體會

2022-02-20 19:07:42 字數 1528 閱讀 5001

乙個.net程式的建立過程

1.建立helloworld.cs;

using system;

void main()

class a

{} 2.csc \o:helloworld.exe helloworld.cs ,編譯為乙個exe檔案,也就是乙個託管模組,在這一步發生的事情很多,

編譯器將c#**編譯為il**,組成乙個標準的pe檔案,就是託管模組,

這個託管模組包括pe32+頭、clr頭、il**和元資料,

pe32+頭:標準的pe頭,但是其中會包括乙個清單(manifest)的資料塊,描述了構成程式集的檔案

clr頭包括所要求的clr版本,一些標誌、入口方法(main)的methoddef元資料標誌,以及模組的元資料、資源、強名稱等資料項的位置和大小;

il**:執行時由clr編譯成本地cpu指令

元資料:兩種型別的表:一種型別描述源**中定義的型別和成員,另一種型別描述源**中引用的型別和成員

3,執行helloworld.exe檔案

首先,windows系統檢查exe的pe頭,判斷是建立32位/64位程序,然後建立程序,分配程序空間

然後,在程序空間中載入mscoree.dll,

第三,程序的主線程執行mscoree.dll內部定義的乙個方法,這個方法初始化clr,引導程式集,然後呼叫其入口方法(main)。(程式集是乙個抽象概念,在這裡指的就是helloworld.exe這個託管模組,因為程式集中只有這乙個模組,ps:還記得嗎,模組中有pe32+頭,clr對程式集處理時,會全部忽略pe頭,呵呵,pe頭在經過windows系統檢查以及建立程序後就被拋棄了)。

第四,il**開始執行了。記住il**是由jit編譯器即時編譯後執行的

4,執行il**的過程:

ps:

*什麼是終結操作(finalize)

~aa();就是物件的終結操作,用於釋放非託管資源。

*對於終結操作的特殊處理:

1,當new乙個物件時,new操作符在託管堆上分配空間,如果型別定義了finalize方法,那麼在該型別的例項構造器呼叫之前,將乙個指向這個物件的指標放入「終結列表」,當垃圾收集時,如果這個物件不可達,那麼將垃圾收集器不會馬上**這個物件的空間,而是將終結列表上的指標放入「終結可達列表」,執行**時,垃圾收集器將託管堆上的其它物件**,這個物件不會**。乙個特殊的執行緒會清空「終結可達列表」,同時執行這個物件的finalize方法。下一次垃圾收集時,這個物件因為不可達,垃圾收集器**託管堆上的這個物件的空間。實際上,因為物件的代會提公升,所以釋放乙個物件占用的記憶體可能的收集次數會超過兩次。

clr怎樣呼叫靜態方法:定位在堆中的型別物件,然後jit編譯這個型別物件的靜態方法,然後執行;

怎樣呼叫非虛例項方法:根據變數的型別找到在堆中的型別物件,檢視是否有該方法,沒有則向上回溯查詢,然後編譯例項方法,執行

怎樣呼叫虛例項方法:根據變數的位址找到發出呼叫的物件,然後檢查這個物件的內部型別指標成員,這個成員引用了物件的實際型別,然後編譯實際型別的方法,執行

所有的型別物件都指向乙個type型別物件,而這個type型別物件則指向本身。呵呵,具體看書

一些彙編學習的體會

學習彙編也已經有一段時間了,用的是王爽的 組合語言 很適合入門的一本書。我學習彙編最初的目的有二 1.在網上看到大家說,計算機專業的不學習彙編是過意不去的。2.加深對計算機工作原理的進一步理解。深入底層才能做的更好嘛。到目前為止,我還只是看完第 10章。很菜很菜。還在除錯 10章那個實驗題。學了大概...

學習grub的一些體會

學習grub的一些體會 最近裝了很多次ubuntu系統,對於grub有了一些認識,今天就跟大家分享一下最近的學習。如果你有ubuntu和windows雙系統 最近都是在win7下裝ubuntu 並且想讓系統預設從windows啟動 首先你應該cd etc grub.d目錄下。該目錄下那些指令碼檔案的...

學習C語言一些體會

在大學裡上過c語言的課,也上過c 的課,但都沒有認真去學習,經過昨天一天c語言的培訓我對c語言有些不一樣的體會。雖然老師講的都是c語言裡面最簡單的資料型別,還有一些簡單的資料運算,但是我基礎實在是差,基本從零學。老師一點一點講解,並夾帶著讓我們自己去敲 執行結果。我覺得這種學習方式很好。學校上課方式...