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