預編譯ASP.NET 把*.aspx.cs文件封裝成dll文件,可以使用.net framework中的aspnet_compiler工具,使用方法如下。
比如我們現(xiàn)在編譯的應用程序,虛擬目錄是aspnet,實際物理路徑是E:aspnet,我們編譯后的目標路徑是E:www,那么我們只要執(zhí)行如下命令就可以了:
1 | aspnet_compiler -v /Aspnet -p c:aspnet c:www |
執(zhí)行完成后,我們發(fā)現(xiàn)E盤下生成了www的目錄,里邊的子目錄App_Code和所有.cs文件都不見了,還有master頁及其代碼.cs文件也不見了。多了一個bin目錄(里邊是些.compiled和dll文件)和一個PrecompiledApp.config文件。其實這時候.aspx文件也被編譯了,只是它作為一個標記文件還存在,實際上沒有任何實質(zhì)性的內(nèi)容(我們發(fā)現(xiàn)這時候每個aspx文件的內(nèi)容都是“這是預編譯工具生成的標記文件,不應被刪除!”,其實刪了也無所謂)。 aspner_compiler 地址:C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_compiler是個很不錯的工具,用來預編譯ASP.NET應用程序。打開Visual Studio 2005命令提示就可以執(zhí)行了。詳細的可以aspner_compiler -?看看幫助。
下面是一個我在實際使用過程中的例子:
首先新建一個網(wǎng)站,建一個名為IMG.ASPX的頁面來生成驗證碼,而我想封裝這個頁面。
使用上述的命令后,加入E:www文件夾下會有一個dll文件,我這名為“App_Web_krtwag-s.dll”,然后就可以在其他項目中添加引用,然后建立一個無后臺的空頁面,將頁面頭部的Inherits屬性更改為”IMG,App_Web_krtwag-s” 之后運行頁面就會得到和封裝前IMG.aspx頁面運行相同的效果。
早于 ASP.NET 2.0 版的 ASP.NET 版本中沒有 ASP.NET 編譯工具。
復制
1 2 3 4 5 6 7 | aspnet_compiler [-?] [-m metabasePath | -v virtualPath [-p physicalPath]] [[-u] [-f] [-d] [-fixednames] targetDir] [-c] [-errorstack] [-nologo] [[-keyfile file | -keycontainer container ] [-aptca] [-delaysign]] |
選項
——————————————————————————–
選項
說明
-m metabasePath
指定要編譯的應用程序的完整 IIS 元數(shù)據(jù)庫路徑。 IIS 元數(shù)據(jù)庫是用于配置 IIS 的分層信息存儲區(qū)。 例如,默認 IIS 網(wǎng)站的元數(shù)據(jù)庫路徑是 LM/W3SVC/1/ROOT。
此選項不能與 -v 選項或 -p 選項一起使用。
-v virtualPath
指定要編譯的應用程序的虛擬路徑。
如果還指定了 -p,則使用伴隨的 physicalPath 參數(shù)的值來定位要編譯的應用程序。 否則,將使用 IIS 元數(shù)據(jù)庫,并且此工具假定源文件位于默認網(wǎng)站(在 LM/W3SVC/1/ROOT 元數(shù)據(jù)庫節(jié)點中指定)中。
此選項不能與 -m 選項一起使用。
-p physicalPath
指定包含要編譯的應用程序的根目錄的完整網(wǎng)絡路徑或完整本地磁盤路徑。 如果未指定 -p,則使用 IIS 元數(shù)據(jù)庫來查找目錄。
此選項必須與 -v 選項一起使用,不能與 -m 選項一起使用。
-u
指定 Aspnet_compiler.exe 應創(chuàng)建一個預編譯的應用程序,該應用程序允許對內(nèi)容(例如 .aspx 頁)進行后續(xù)更新。
如果省略該選項,生成的應用程序?qū)H包含編譯的文件,而無法在部署服務器上進行更新。 只能通過更改源標記文件并重新編譯來更新應用程序。
必須包括參數(shù) targetDir。
使用此選項時,不會編譯 .aspx 文件中的代碼塊(也就是位于 script 元素中或 <% 和 %>標記之間的代碼)。 因此,如果這些代碼塊中存在編譯錯誤,則只能在運行時顯示錯誤,因為只有這樣才能完全編譯 .aspx 文件。 將此選項用于依賴于 .aspx 文件中的代碼塊的站點通常是不安全的。
-f
指定該工具應該覆蓋 targetDir 目錄及其子目錄中的現(xiàn)有文件。
-d
重寫應用程序源配置文件中定義的設置,強制在編譯的應用程序中包括調(diào)試信息。 否則,將不會發(fā)出調(diào)試輸出。
不能將 -d 選項用于就地編譯;就地編譯使用調(diào)試選項的配置設置。
targetDir
將包含編譯的應用程序的根目錄的網(wǎng)絡路徑或本地磁盤路徑。 如果未包括 targetDir 參數(shù),則就地編譯應用程序。
-c
指定應完全重新生成要編譯的應用程序。 已經(jīng)編譯的組件將重新進行編譯。 如果省略此選項,該工具將僅生成應用程序中自上次執(zhí)行編譯以來被修改的那些部分。
-errorstack
指定該工具應在未能編譯應用程序時包括堆棧跟蹤信息。
-keyfile file
指定應該將 AssemblyKeyFileAttribute(指示包含用于生成強名稱的公鑰/私鑰對的文件名)應用于編譯好的程序集。
此選項必須與 -aptca 選項一起使用。 如果代碼文件中已經(jīng)將該特性應用于程序集,Aspnet_compiler.exe 將引發(fā)一個異常。
-keycontainer container
指定應該將 AssemblyKeyNameAttribute(指示用于生成強名稱的公鑰/私鑰對的容器名)應用于編譯好的程序集。
此選項必須與 -aptca 選項一起使用。 如果代碼文件中已經(jīng)將該特性應用于程序集,Aspnet_compiler.exe 將引發(fā)一個異常。
-aptca
指定應該將 AllowPartiallyTrustedCallersAttribute(允許部分受信任的調(diào)用方訪問程序集)應用于 Aspnet_compiler.exe 生成的具有強名稱的程序集。
此選項必須與 -keyfile 或 -keycontainer 選項一起使用。 如果代碼文件中已經(jīng)將該特性應用于程序集,Aspnet_compiler.exe 將引發(fā)一個異常。
-delaysign
指定應該將 AssemblyDelaySignAttribute(指示應該只使用公鑰標記對程序集進行簽名,而不使用公鑰/私鑰對)應用于生成的程序集。
此選項必須與 -keyfile 或 -keycontainer 選項一起使用。 如果代碼文件中已經(jīng)將該特性應用于程序集,Aspnet_compiler.exe 將引發(fā)一個異常。
使用 -delaysign 選項時,Aspnet_compilier.exe 生成的代碼在完成代碼簽名之前即可運行。 必須確保該代碼在完成簽名之前不易受到惡意用戶的攻擊。
-fixednames
指定應該為應用程序中的每一頁生成一個程序集。 每個程序集的名稱使用原始頁的虛擬路徑,除非此名稱超過操作系統(tǒng)的文件名限制。如果超過限制,將生成一個哈希值,并將其用于程序集名稱。
不能將 -fixednames 選項用于就地編譯;就地編譯使用編譯批處理模式的配置設置。
-nologo
取消顯示版權(quán)信息。
-?
顯示該工具的命令語法和選項。
備注
——————————————————————————–
有兩個版本的 ASP.NET 編譯工具:
.NET Framework 2.0 中附帶的版本。 可以使用此版本編譯針對 .NET Framework 2.0、.NET Framework 3.0 或 .NET Framework 3.5 的網(wǎng)站。 這些站點必須部署在應用程序池中,該應用程序池與 .NET Framework 的目標版本關聯(lián)。
.NET Framework 4 中附帶的版本。 可以使用此版本編譯針對 .NET Framework 4 及更高版本的網(wǎng)站。 此版本的工具可以創(chuàng)建僅適用于 .NET Framework 4 CLR 的程序集,即使 Web.config 文件缺少 targetFramework 特性。
如果打算將應用程序部署到與 .NET Framework 4 版 相關聯(lián)的應用程序池,則可以使用此版本來編譯 Web.config 文件指示其面向早期版本之一的應用程序。
有關如何開發(fā)、編譯和部署特定于 .NET Framework 版本的網(wǎng)站的更多信息,請參見針對 ASP.NET Web 項目的 .NET Framework 多目標功能 和 ASP.NET 并行執(zhí)行概述。 有關 ASP.NET 編譯工具如何確定網(wǎng)站的目標 .NET Framework 版本的信息,請參見 BuildManager..::..TargetFramework 屬性。
可以通過以下兩種常用方式來使用 ASP.NET 編譯工具:就地編譯和為部署進行的編譯,后者需要指定目標輸出目錄。 下面的幾節(jié)將介紹這些方案。
就地編譯應用程序
ASP.NET 編譯工具可以就地編譯應用程序,也就是說,它模仿對應用程序發(fā)出多個請求的行為,從而導致進行常規(guī)編譯。 預編譯站點的用戶將不會遇到因第一次請求而編譯頁面帶來的延遲。
請注意,如果使用的是模擬帳戶,則該帳戶和登錄用戶帳戶都必須具有對目標的寫訪問權(quán)限,預編譯才能成功。
就地預編譯站點時,請注意下列事項:
站點將保留它的文件和目錄結(jié)構(gòu)。
服務器上必須具有供此站點使用的所有編程語言的編譯器。
如果任何文件編譯失敗,整個站點的編譯將失敗。
還可以在向應用程序添加新的源文件之后就地重新編譯應用程序。 除非包括 -c 選項,否則該工具僅編譯新文件和更改過的文件。
說明
編譯包含嵌套應用程序的應用程序時,不會編譯嵌套應用程序。 必須單獨編譯嵌套應用程序。
說明
當您編譯包含母版頁的 Web 應用程序時,如果將該應用程序編譯為可更新的站點,則編譯可能會失敗并且會發(fā)生命名沖突。 如果母版頁的名稱與從該母版頁派生的內(nèi)容頁的命名空間名稱相匹配,則可能發(fā)生該沖突。 (繼承關系是由 @ Page 指令的 Inherits 特性建立的。) 若要解決此問題,可以更改母版頁的類名或者更改命名空間名稱,或者可以將該應用程序編譯為不可更新。
說明
如果使用工具的 .NET Framework 4 版本來就地預編譯網(wǎng)站,并且該站點面向 .net Framework 的早期版本,同時與面向 .NET Framework 2.0 CLR 的應用程序池相關聯(lián),則對 Web 應用程序的首次請求將導致動態(tài)編譯,就如同尚未對該站點進行預編譯。 這是因為命令行編譯器編譯到 .NET Framework 2.0 CLR 無法識別的 .NET Framework 4 臨時文件夾中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | 為進行部署編譯應用程序 通過指定 targetDir 參數(shù)來編譯應用程序以進行部署(編譯到某個目標位置)。 targetDir 可以是 Web 應用程序的最終位置;也可以進一步部署編譯好的應用程序。 使用 -u 選項將以下面的方式編譯應用程序:可以對編譯好的應用程序中的某些文件做出更改,而無需重新編譯該應用程序。 Aspnet_compiler.exe 區(qū)分靜態(tài)和動態(tài)文件類型之間的不同,并在創(chuàng)建生成的應用程序時,以不同的方式對它們進行處理。 靜態(tài)文件類型是指那些沒有關聯(lián)的編譯器或生成提供程序的文件類型,例如具有 .css、.gif、.htm、.html、.jpg、.js 等擴展名的文件。 這些文件只是復制到目標位置,并且在保留的目錄結(jié)構(gòu)中保持它們的相對位置。 動態(tài)文件類型是指那些具有關聯(lián)的編譯器或生成提供程序的文件類型,包括具有 ASP.NET 特定文件擴展名(如 .asax、.ascx、.ashx、.aspx、.browser、.master 等等)的文件。 ASP.NET 編譯工具從這些文件生成程序集。 如果省略 -u 選項,該工具還會創(chuàng)建具有文件擴展名 .COMPILED 的文件,這些文件將原始源文件映射到它們的程序集。 為確保保留應用程序源的目錄結(jié)構(gòu),該工具在目標應用程序的相應位置中生成占位符文件。 必須使用 -u 選項,以指示可以修改編譯好的應用程序的內(nèi)容。 否則,將忽略后續(xù)修改或者導致運行時錯誤。 下表描述了在包括 -u 選項的情況下,ASP.NET 編譯工具是如何處理不同的文件類型的。 文件類型 編譯器操作 .ascx、.aspx、.master 這些文件將被拆分為標記和源代碼,其中包括代碼隱藏文件。 源代碼編譯到程序集中,其名稱派生于哈希算法,且程序集放置在 Bin 目錄中。 任何內(nèi)聯(lián)代碼(即包含在 <script runat="server"> 元素中的代碼)都包括在標記中,不進行編譯。 將創(chuàng)建與源文件同名的新文件來包含標記,新文件位于相應的輸出目錄中。 .ashx、.asmx 這些文件不進行編譯,而是原樣移動到輸出目錄中。 如果希望編譯處理程序代碼,請將這些代碼放入 App_Code 目錄的源代碼文件中。 .cs、.vb、.jsl、.cpp (不包括先前列出的文件類型的代碼隱藏文件) 這些文件會進行編譯,并作為資源包含在引用它們的程序集中。 源文件不復制到輸出目錄中。 如果不引用代碼文件,則這些文件不會進行編譯。 自定義文件類型 這些文件不進行編譯。 這些文件復制到相應的輸出目錄中。 App_Code 子目錄中的源代碼文件 這些文件編譯到程序集中,且放置在 Bin 目錄中。 說明 App_Code 目錄中的靜態(tài)文件類型不復制到輸出目錄中。 App_GlobalResources 子目錄中的 .resx 和 .resource 文件 這些文件編譯到程序集中,且放置在 Bin 目錄中。 不會在主輸出目錄中創(chuàng)建 App_GlobalResources 子目錄,且不會將源目錄中的 .resx 或 .resources 文件復制到輸出目錄中。 說明 App_GlobalResources 子目錄中的資源文件先編譯到程序集中,然后編譯 App_Code 子目錄中的代碼。不支持在編譯之后修改資源文件。 App_LocalResources 子目錄中的 .resx 和 .resource 文件 這些文件不進行編譯,它們復制到相應的輸出目錄中。 App_Themes 子目錄中的 .skin 文件 .skin 文件和靜態(tài)主題文件不進行編譯,它們復制到相應的輸出目錄中。 .browser Web.config 靜態(tài)文件類型 Bin 目錄中已存在的程序集 這些文件原樣復制到輸出目錄中。 下表描述了在省略 -u 選項的情況下,ASP.NET 編譯工具是如何處理不同的文件類型的。 說明 不會提供阻止您修改已編譯應用程序的源代碼的警告。 文件類型 編譯器操作 .aspx、.asmx、.ashx、.master 這些文件被拆分為標記和源代碼,其中包括代碼隱藏文件和包含在 <script runat="server"> 元素中的任何代碼。 源代碼編譯到程序集中,其名稱派生于哈希算法。 生成的程序集放置在 Bin 目錄中。 任何內(nèi)聯(lián)代碼(即包含在 <% 和 %> 括號之間的代碼)包括在標記中,不進行編譯。 編譯器將創(chuàng)建新文件,以包括與源文件同名的標記。 這些生成的文件放置在 Bin 目錄中。 編譯器還會創(chuàng)建與源文件同名的文件,但新創(chuàng)建的文件具有擴展名 .COMPILED 且包含映射信息。 .COMPILED 文件放置在與源文件的原始位置相對應的輸出目錄中。 .ascx 這些文件被拆分為標記和源代碼。 源代碼編譯到程序集中,且放置在 Bin 目錄中,其名稱派生于哈希算法。 不生成標記文件。 .cs、.vb、.jsl、.cpp (不包括先前列出的文件類型的代碼隱藏文件) 從 .ascx、.ashx 或 .aspx 文件生成的程序集所引用的源代碼編譯到程序集中,且放置在 Bin 目錄中。 不復制源文件。 自定義文件類型 這些文件像動態(tài)文件一樣進行編譯。 編譯器可以將映射文件放置在輸出目錄中,具體取決于它們所基于的文件類型。 App_Code 子目錄中的文件 該子目錄中的源代碼文件編譯到程序集中,且放置在 Bin 目錄中。 說明 App_Code 目錄中的靜態(tài)文件類型不復制到輸出目錄中。 App_GlobalResources 子目錄中的文件 這些文件編譯到程序集中,且放置在 Bin 目錄中。 不會在主輸出目錄下創(chuàng)建 App_GlobalResources 子目錄。 如果配置文件指定了 appliesTo="All",則 .resx 和 .resources 文件復制到輸出目錄中。 如果這些文件被 BuildProvider 引用,則不會被復制。 App_LocalResources 子目錄中的 .resx 和 .resource 文件 這些文件編譯到程序集中,具有唯一的名稱,且放置在 Bin 目錄中。 不會將 .resx 或 .resource 文件復制到輸出目錄中。 App_Themes 子目錄中的 .skin 文件 主題文件編譯到程序集中,且放置在 Bin 目錄中。 為 .skin 文件創(chuàng)建存根 (stub) 文件,并將它們放置在相應的輸出目錄中。 靜態(tài)文件(如 .css)復制到輸出目錄中。 .browser Web.config 靜態(tài)文件類型 Bin 目錄中已存在的程序集 這些文件原樣復制到輸出目錄中。 |