前文演示了編譯SSCLI最簡便的方法(在Windows下):
- 在“Visual Studio 2005 Command Prompt”下,進(jìn)入SSCLI的根目錄;
- 運(yùn)行 env.bat 腳本準(zhǔn)備環(huán)境;
- 運(yùn)行 buildall.cmd 腳本開始編譯過程。
env.bat設(shè)置了當(dāng)前SSCLI的運(yùn)行環(huán)境,命令的語法是:env [option],其中[option]可以是 debug、checked 和 free ,各個(gè)環(huán)境選項(xiàng)說明如下表:
- debug:關(guān)閉代碼優(yōu)化設(shè)置,啟用調(diào)試用代碼(一般是通過條件編譯開關(guān)),生成調(diào)試用符號文件。
- checked: 打開代碼優(yōu)化設(shè)置,啟動(dòng)調(diào)試用代碼,生成符號文件。
-
free :打開代碼優(yōu)化設(shè)置,關(guān)閉調(diào)試用代碼,生成符號文件。
出于解讀代碼的需要,一般都會選擇debug選項(xiàng)。
設(shè)定好運(yùn)行環(huán)境后,buildall.cmd的編譯過程可以分為下面幾大步驟:
- 編譯基本的引導(dǎo)工具集:平臺抽象層(PAL)和非托管程序(unmanaged)編譯工具;
- 編譯輔助的引導(dǎo)工具集:剩余的工具集和相關(guān)基礎(chǔ)架構(gòu);
- 編譯CLR內(nèi)核、基本類庫,C#編譯器和其他支持工具;
- 編譯其它.NET類庫和支持工具
- 編譯其它托管程序的編譯器,如JS編譯器。
其實(shí).NET天生就是跨平臺的,SSCLI 2.0除了支持Windows平臺,還支持FreeBSD和Mac OS X,源碼可以在FreeBSD 4.8和Mac OS X 10.2下編譯通過,通過修改一些源碼,還可以在Linux平臺下編譯和使用,實(shí)際上SSCLI 1.1通過一些修改可以在Red Hat 8.0下編譯通過。
為了在后文說明方便,這里用SSCLI內(nèi)置的幾個(gè)環(huán)境變量來指代將會提到的文件夾路徑:
-
%ROTOR_DIR%: SSCLI的根目錄,如Windows平臺下一般是
c:\sscli,在編譯過程中,編譯系統(tǒng)會自行設(shè)置此環(huán)境變量。 -
%_NTTREE%:整個(gè)SSCLI編譯輸出結(jié)果的保存路徑,其值一般是:
%ROTOR_DIR%\binaries.x86*.rotor\,*號根據(jù)bat 的選項(xiàng)賦值,如env.bat的選項(xiàng)是debug,那么它的值就是%ROTOR_DIR%\binaries.x86dbg.rotor\。
基本引導(dǎo)工具集
SSCLI的源碼由C++、C#這些非托管和托管編程語言組成,而且SSCLI是跨平臺的,因此在編譯過程中編譯系統(tǒng)會用操作系統(tǒng)上安裝的C++編譯器編譯好編譯SSCLI剩余源碼的工具集。在這一步編譯過程中,基本引導(dǎo)工具集包括下面這些組件:
-
平臺抽象層(PAL):PAL是系統(tǒng)中其它所有組件的依賴項(xiàng),因此必須先編譯它:
- 源碼位置(Windows平臺):%ROTOR_DIR%\pal\win32
- 源碼位置(Unix平臺):%ROTOR_DIR%\pal\unix
- 輸出路徑:%_NTTREE%\rotor_pal.dll
-
Nmake工具集:nmake是Windows SDK系統(tǒng)下的編譯工具,類似unix下的make。SSCLI自帶了nmake的源碼,如果是在Unix或Linux系統(tǒng)下編譯,會編譯此工具;或者在Windows平臺下,就用SDK系統(tǒng)下自帶的nmake工具了:
- 源碼位置:%ROTOR_DIR%\tools\nmake
- 輸出路徑:%_NTTREE%\nmake.exe
-
編譯結(jié)果的處理工具:
- 源碼位置:%ROTOR_DIR%\tools\binplace
- 輸出路徑:%_NTTREE%\binplace.exe
-
編譯系統(tǒng)其它組件的編譯工具集:
- 源碼位置:%ROTOR_DIR%\tools\build
- 輸出路徑:%_NTTREE%\build.exe
輔助引導(dǎo)工具集
輔助引導(dǎo)工具集與前面基本引導(dǎo)工具集的區(qū)別是,輔助引導(dǎo)工具集用的是SSCLI編譯系統(tǒng)自帶的build.exe編譯的,源文件列表等編譯規(guī)則是保存在sources.lst文件里的,而基本引導(dǎo)工具集是用make命令編譯,而且源文件列表等編譯規(guī)則是保存在makefile文件夾里的。
輔助引導(dǎo)工具集包括下列這些組件:
-
資源編譯器
- 源碼位置:%ROTOR_DIR%\tools\resourcecompiler
- 輸出路徑:%_NTTREE%\resourcecompiler.exe
-
PAL運(yùn)行時(shí)(PAL RT):PAL RT包含了SSCLI和其一些輔助工具都用到的跨平臺的功能。
- 源碼位置:%ROTOR_DIR%\palrt\src
- 輸出路徑:%_NTTREE%\rotor_palrt.dll
編譯CLR內(nèi)核、基本類庫,C#編譯器和其他支持工具
引導(dǎo)工具集編譯完成后,就可以開始編譯整個(gè)CLR、.NET基本類庫、C#編譯器等工具了,各工具的源碼位置、輸出路徑如下表所示:
- \clr\src: 整個(gè)CLR內(nèi)核和基本類庫的源碼路經(jīng)
- \clr\src\vm:CLR虛擬機(jī)引擎的源碼,包括GC、JIT、類庫加載器等完整功能
- \csharp:C#編譯器和Assembly鏈接程序的源碼路經(jīng)
- \clr\src\bcl:.NET基本類庫源碼,如System.IO、System.Collections這些命名空間下面的類庫源碼都在這里
- \clr\src\dlls: 其它進(jìn)程跟CLR虛擬機(jī)交換的幾個(gè)關(guān)鍵DLL的源碼,包括下面這些組件:
- shim:主要是確定當(dāng)前機(jī)器上安裝了哪些.net版本
- mscorsn:用來做強(qiáng)簽名驗(yàn)證
- mscorpe:Windows平臺可執(zhí)行文件PE格式讀寫庫
- mscoree:用來在進(jìn)程中加載CLR虛擬機(jī)
- mscordbi和mscordbc:調(diào)試服務(wù)
- \src\utilcode:被很多CLR虛擬機(jī)組件共享的通用代碼
- \src\fjit:JIT編譯器,即mscorejit.dll的源碼
- \src\fusion:搜索和加載Assembly、GAC(Global Assembly Cache)的組件,即fusion.dll的源碼
- \src\ilasm:IL語言編譯器
- \src\ildasm:IL反編譯工具
- \src\debug:托管調(diào)試器 cordbg 的源碼
- \src\md:Assembly元數(shù)據(jù)讀寫庫
- \src\tools:多個(gè)非托管工具的源碼:
- clix:托管程序解釋執(zhí)行工具
- ildbsymbols:托管程序調(diào)試符號文件讀寫工具
- metainfo:assembly元數(shù)據(jù)讀取工具
- peverify:驗(yàn)證托管程序的IL程序
- internalresgen:
- sn:強(qiáng)簽名操作工具
- permview:Assembly權(quán)限查看工具
- gac:全局Assembly緩存管理工具
- sos:Windbg調(diào)試.NET程序的輔助函數(shù)庫
其它.NET類庫和支持工具
這里面提供了一些除基本類庫以外的少量類庫源碼:
- System.dll:%ROTOR_DIR%\fx\src\sys
- System.xml.dll:%ROTOR_DIR%\fx\src\xml
- System.Runtime.Serialization.Formatters.Soap.dll:%ROTOR_DIR%\managedlibraries\soapserializer
- System.Runtime.Remoting.dll:%ROTOR_DIR%\managedlibraries\remoting
其它托管程序的編譯器
SSCLI里面還附帶了一個(gè)使用C#語言開發(fā)的Microsoft Jscript編譯器實(shí)現(xiàn),而這個(gè)編譯器本身就能編譯托管程序,其源碼路經(jīng)是:%ROTOR_DIR%\jscript