共用方式為


了解 ASP.NET 動態編譯

更新:2007 年 11 月

為了讓 Web 應用程式服務要求,ASP.NET 必須先將 Web 應用程式的程式碼剖析並編譯為一個或多個組件 (Assembly)。編譯程式碼時,就會轉譯為和語言及 CPU 無關的表示,即為 Microsoft Intermediate Language (MSIL)。在執行階段,MSIL 會在 .NET Framework 內容中執行,針對執行應用程式之電腦上的處理器,將 MSIL 轉譯為 CPU 特定的指令。

對第一次要求編譯

根據預設,當使用者第一次要求網站上的資源時,例如 ASP.NET 網頁 (.aspx 檔案),會以動態方式編譯 ASP.NET Web 網頁和程式碼檔。頁面和程式碼檔第一次編譯之後,就會快取已編譯的資源,如此後續對相同頁面的要求會非常有效率。

ASP.NET 支援下列檔案類型的動態編譯:ASP.NET 網頁 (.aspx 檔案)、ASP.NET Web 服務 (.asmx 檔案)、ASP.NET 處理常式 (.ashx 檔案) 和 ASP.NET 應用程式檔案 (Global.asax),以及其他檔案 (例如原始程式碼和類別檔案)。如需 ASP.NET 檔案類型的詳細資訊,請參閱 網站檔案類型。如需 ASP.NET 編譯程序的詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀中的<編譯生命週期>一節。

對變更重新編譯

任何對動態編譯過的檔案所做的變更將自動使檔案的快取編譯組件失效,並觸發重新編譯所有受影響的資源,而在下一次對程式碼發出要求時,ASP.NET 才會識別程式碼已變更並重新編譯 Web 應用程式之受影響的資源。這個方式能讓您讓以最少的編譯處理成本來快速開發應用程式(請注意,需視對資源的變更而定,結果範圍可以從重新編譯單一網頁到重新編譯整個網站)。

編譯相依性

當第一次對應用程式發出要求時,ASP.NET 會按特定的順序編譯檔案。第一批要編譯的項目稱為最上層項目。在第一次要求後,只有相依性變更時,才會重新編譯最上層項目。

而最上層項目包括了 App_GlobalResources 資料夾、App_WebResources 資料夾、設定檔屬性、App_Code 資料夾和 Global.asax 檔案。在將最上層項目編譯後,ASP.NET 才會編譯其他項目。而這些項目包括了 App_LocalResources 資料夾、個別 ASP.NET 網頁 (.aspx 檔案)、ASP.NET 使用者控制項 (.ascx 檔案)、ASP.NET HTTP 處理常式 (.ashx 檔案)、ASP.NET HTTP 模組 (.asmx 檔案),以及佈景主題、主版頁面 (Master Page) 和其他原始程式檔 (Source File)。

如需詳細資訊,請參閱 ASP.NET 網站配置IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀中的<編譯生命週期>一節。

編譯輸出

當編譯程式碼後,會在伺服器的資料夾中快取產生的組件,這個資料夾需要有適當的權限,這樣程式碼才會正確編譯並執行。您可以設定程式碼在其下編譯並執行的編譯資料夾位置或權限。

編譯資料夾位置

根據預設,當編譯 Web 應用程式時,會將已編譯的程式碼放在 Temporary ASP.NET Files 資料夾中。這個資料夾是 .NET Framework 安裝所在位置的子資料夾,通常位置如下:

%SystemRoot%\Microsoft.NET\Framework\versionNumber\Temporary ASP.NET Files

需要權限的編譯資料夾

.NET 安裝程序會建立 Temporary ASP.NET Files 資料夾,並指派存取權限給 ASP.NET 本機使用者帳戶,讓這個帳戶有存取已編譯的程式碼所需的高信任權限。如果要修改組態或帳戶設定,您必須確認所使用的帳戶有存取 Temporary ASP.NET Files 資料夾的高信任權限。如需詳細資訊,請參閱 HOW TO:在使用者帳戶下執行背景工作處理序

編譯資料夾的組態設定性

ASP.NET 會為每個應用程式在 Temporary ASP.NET File 資料夾下建立離散的子資料夾。您可以使用組態檔之編譯區段的 tempDirectory 屬性設定根 (Root) 目錄位置。這個選擇性屬性可以讓您指定編譯期間暫存檔案儲存區所使用的目錄。預設為空字串 ("")。在空字串的情況下,再加上如果目前程序有所需的存取權限,則會將檔案存放在下列目錄:

%FrameworkInstallLocation%\Temporary ASP.NET Files

如需詳細資訊,請參閱compilation 項目 (ASP.NET 設定結構描述)CompilationSectionTempDirectory 屬性。

多重語言支援

ASP.NET 2.0 支援在同一個 Web 應用程式中使用多種程式語言。在 App_Code 目錄中,您可以指定每個語言 (例如 C# 和 Visual Basic) 的子資料夾,而 ASP.NET 將會為每個子資料夾建立個別的組件。如需詳細資訊,請參閱ASP.NET 網站中的共用程式碼資料夾逐步解說:使用多種程式語言開發網站

動態編譯的優劣之處

ASP.NET 動態編譯能使您在部署 Web 應用程式之前,不需明確編譯程式碼即可修改原始程式碼。如果修改原始程式檔,ASP.NET 會自動重新編譯檔案,並更新所有連結的資源。除非有變更 <processModel> 區段,否則不需要為了讓變更生效而重新啟動 IIS 伺服器。此外,藉由為編譯期間呼叫的新檔案類型建立自訂組建提供者,您可以擴充 ASP.NET 組建系統。ASP.NET 組建系統的動態編譯優點是也提供與舊版 ASP.NET 應用程式和型別的回溯相容性。

有某些功能是動態編譯所不提供的。動態編譯可以指定較晚的初始回應時間給使用者,因為第一次要求網頁和程式碼檔案時必須先加以編譯,但這可能特別對經常更新的大型網站造成問題。動態編譯並不會在使用者存取網站之前,提供識別編譯時期錯誤的方法。同樣地,在沒有原始程式碼的情況下,動態編譯也不會提供建立可部署到實際執行伺服器 (Production Server) 之網站編譯版本的能力。如果 Web 應用程式涉及這些問題,您可以重新編譯網站。如需詳細資訊,請參閱 ASP.NET 先行編譯概觀

請參閱

工作

HOW TO:在共用伺服器上保護 ASP.NET 應用程式的安全

概念

ASP.NET 模擬

ASP.NET 所需的存取控制清單 (ACL)

網站檔案類型

ASP.NET 網站配置

參考

CodeGenDir