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