1.1.2 .NET程序編譯原理
.NET平臺(tái)中代碼的物理單元是可移植可執(zhí)行程序(Protable Executable,PE)格式,編譯程序和庫(kù)時(shí),和平常一樣生成EXE與DLL文件,但在.NET框架下,任何可執(zhí)行程序項(xiàng)目都鏈接公共語(yǔ)言運(yùn)行庫(kù),并由它代理編譯和執(zhí)行。
.NET中程序編譯的最主要部分是匯編(assembly),其包括一個(gè)manifest,它是一組元數(shù)據(jù),標(biāo)識(shí)匯編向其他應(yīng)用程序提供的文件和類(lèi)型,另外,manifest還可以包含強(qiáng)名稱(strong name)、組合匯編名、版本信息和可選文化信息。在使用強(qiáng)名稱的匯編中,元數(shù)據(jù)包含一個(gè)公用密鑰簽名,公共語(yǔ)言運(yùn)行庫(kù)用其驗(yàn)證匯編自編譯之后是否發(fā)生改變。
匯編還可以包括數(shù)字簽名,如用驗(yàn)證碼(Authenticode certificate)驗(yàn)證代碼源,以解決在公共語(yǔ)言運(yùn)行庫(kù)保證匯編簽名的真實(shí)性。
匯編分為專(zhuān)用匯編和共享匯編兩種。專(zhuān)用匯編只在安裝這個(gè)匯編的應(yīng)用程序中使用,而共享匯編則安裝在全局匯編緩沖區(qū)(Global Assembly Cache,GAC)中,全局匯編緩沖區(qū)用匯編的引用計(jì)數(shù)和版本信息管理庫(kù),包括框架的基類(lèi)庫(kù)(Base Class Library,BCL),并通過(guò)公共語(yǔ)言運(yùn)行庫(kù)避免因庫(kù)的版本沖突而形成DLL Hell的情形。
選擇專(zhuān)用匯編和共享匯編是一個(gè)重要決策。將匯編安裝到全局緩沖區(qū)后,就可以在多個(gè)應(yīng)用程序中使用匯編的一個(gè)備份,但是還需要用Windows Installer之類(lèi)的安裝程序?qū)?yīng)用程序安裝到計(jì)算機(jī)上。如果使用專(zhuān)用匯編,則得到Microsoft所謂的“XCOPY部署”,這樣用戶可以將應(yīng)用程序復(fù)制到目標(biāo)計(jì)算機(jī)上,方便地進(jìn)行安裝。
.NET程序編譯過(guò)程如圖1.2所示。