既然編譯為程序集可以在三種情況下發(fā)生(由開(kāi)發(fā)人員顯式進(jìn)行,使用 aspnet_compiler.exe,或者在請求處理中進(jìn)行),因此了解文件到程序集的映射變得更為重要。實(shí)際上,根據編寫(xiě)頁(yè)面的方式,您實(shí)際上可以得到一個(gè)應用程序,在作為全源或全二進(jìn)制部署時(shí),該應用程序可以正常工作,但在使用可更新的切換進(jìn)行部署時(shí),卻編譯失敗。
模型 ASP.NET 通常使用 App_Code 目錄內容的單獨程序集以及 global.asax 文件(如果存在),然后將每個(gè)目錄中的所有 .aspx 頁(yè)編譯為單獨的程序集。(如果同一目錄中的頁(yè)面是以不同語(yǔ)言制作的,或者它們通過(guò) @ Reference 指令彼此依賴(lài),則它們也可以形成單獨的程序集。)用戶(hù)控件和母版頁(yè)通常也獨立于 .aspx 頁(yè)進(jìn)行編譯。例如,如果要在一個(gè)項目中包含 Visual Basic® 和 C# 源代碼,也可以配置 App_Code 目錄來(lái)創(chuàng )建多個(gè)程序集。在程序集創(chuàng )建的細節中有一些細微差別,這取決于您所選的部署模式。圖 6 描述特定 Web 站點(diǎn)的組件,該 Web 站點(diǎn)基于您要使用的部署模式編譯為單獨的程序集。(請注意,我要忽略資源、主題和瀏覽器目錄,因為它們不包含代碼,雖然它們也編譯為單獨的程序集。正如前面提到的,目標程序集也因語(yǔ)言的不同和引用依賴(lài)項而異。)
程序集生成的另一個(gè)技巧是,使用 aspnet_compiler 的 -fixednames 選項請求將每個(gè) .aspx 文件編譯為單獨的程序集,該程序集的名稱(chēng)跨編譯器的不同調用保持一致。如果您想更新單個(gè)頁(yè)面而不修改部署站點(diǎn)上的其他程序集,這是很有用的。它也可以為任何大型站點(diǎn)生成大量程序集,因此您一定要在使用該選項之前測試您的部署。
如果您覺(jué)得這比較復雜,我可以告訴您它的優(yōu)點(diǎn),即您無(wú)需花費大量時(shí)間考慮將哪些文件映射為單獨的程序集。.aspx 文件一直在最后進(jìn)行編譯,并一直包括對生成的所有其他程序集的引用,因此,無(wú)論您選擇哪種部署模型,它通常都會(huì )正常工作。
在部署中,可能實(shí)際影響您在頁(yè)面中制作代碼的方式的一個(gè)重要區別是,當使用可更新部署時(shí)編譯中的分離。當部署可更新站點(diǎn)時(shí),代碼隱藏文件在部署之前編譯為單獨的程序集。從 .aspx 文件生成的類(lèi)不進(jìn)行編譯,除非作出對目錄中文件的實(shí)際請求。這與二進(jìn)制部署(其中所有文件在部署之前編譯)以及源部署(其中所有文件在請求時(shí)編譯)形成了鮮明對比。以下這一簡(jiǎn)單的示例解釋這是如何引出問(wèn)題的,請考慮圖 7 中帶有嵌入屬性的用戶(hù)控件(.ascx 文件),以及一個(gè)使用該控件并從其代碼隱藏類(lèi)設置該屬性的相關(guān)頁(yè)面。
圖 7 中的頁(yè)面將以源或二進(jìn)制部署模式編譯并運行,但是當作為可更新站點(diǎn)部署時(shí)將無(wú)法編譯,原因是該用戶(hù)控件 Color 屬性的定義在部署時(shí)不可用(該限制也存在于 1.x 模型中)。要避免此類(lèi)問(wèn)題發(fā)生,通常您可以將所有代碼放在代碼隱藏文件中,或者干脆不使用代碼隱藏文件,將代碼直接放在 .aspx 和 .ascx 文件中。
有關(guān)文件到程序集映射的另一個(gè)注意事項是,使用內部關(guān)鍵字防止外部程序集訪(fǎng)問(wèn)類(lèi)中的方法,這可能只在某些部署方案中奏效而在其他方案中卻不然,這是因為存在不同的程序集映射選項。除非您提前計劃要使用哪個(gè)部署選項,否則最好避免在頁(yè)面中使用內部方法并繼續使用類(lèi)型范圍的保護關(guān)鍵字:公共、受保護和私有。
對于 ASP.NET 開(kāi)發(fā)人員而言,ASP.NET 2.0 中的新代碼隱藏模型既熟悉又陌生。之所以說(shuō)熟悉是因為,它仍然使用繼承將代碼隱藏類(lèi)與其 .aspx 生成的類(lèi)定義相關(guān)聯(lián),而之所以說(shuō)陌生是因為,諸如部分類(lèi)這樣的元素和控件成員變量聲明的隱式生成都是基本的轉換。實(shí)際上,您可能不會(huì )注意到用法上的許多差別,但是無(wú)論您何時(shí)進(jìn)行非一般的操作(例如,創(chuàng )建一個(gè)通用基 Page 類(lèi),或者將代碼隱藏與內聯(lián)代碼模型混合),了解本文描述的類(lèi)關(guān)系和程序集映射都是很重要的。
聯(lián)系客服