ASP.NET Whidbey 中新的代碼編譯功能
2024-07-10 13:05:22
供稿:網(wǎng)友
 
asp.net whidbey 中新的代碼編譯功能
g. andrew duthie
graymad enterprises, inc.
2003 年 10 月
摘要:了解如何利用 asp.net whidbey 更輕松地使用代碼。code 目錄會(huì)自動(dòng)為您的站點(diǎn)編譯代碼,而預(yù)編譯會(huì)使部署工作更容易。 
下載本文的源代碼。(請(qǐng)注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解。)
目錄
簡(jiǎn)介
新的模塊化代碼模型
/code 目錄
利息計(jì)算器
預(yù)編譯支持
在位預(yù)編譯
部署預(yù)編譯
intellisense 無(wú)處不在!
小結(jié)
簡(jiǎn)介
即將推出的新版 microsoft® asp.net 介紹了大量新功能和改進(jìn)功能,它的代號(hào)為 asp.net whidbey,是根據(jù)新版 microsoft® visual studio® .net 的代號(hào)命名的。其中的某些功能利用了基礎(chǔ) microsoft® .net framework 版本(asp.net whidbey 就是基于該版本構(gòu)建的)中的新功能。在這些功能當(dāng)中,最有用的功能集之一與代碼編譯有關(guān)。
本文介紹 asp.net whidbey 編譯模型的主要更改、這些更改對(duì)編寫(xiě) asp.net 應(yīng)用程序的影響,以及如何利用這些更改。
改進(jìn)的功能和新的編譯功能可以分為以下四個(gè)基本方面: 
對(duì)模塊化代碼模型的改進(jìn)。 
新的 code 目錄。 
新增的對(duì)預(yù)編譯 asp.net 應(yīng)用程序的支持。 
microsoft® intellisense® 增強(qiáng)功能。 
新的模塊化代碼模型
默認(rèn)情況下,使用 visual studio .net 2002 或 2003 開(kāi)發(fā)的站點(diǎn)使用一種稱為“模塊化代碼”的功能將可視元素(html 標(biāo)記、控件等)從與 ui 相關(guān)的編程邏輯中分離開(kāi)來(lái)。當(dāng)開(kāi)發(fā)人員創(chuàng)建一個(gè)新 web 窗體(例如 foo.aspx)時(shí),visual studio 會(huì)自動(dòng)創(chuàng)建一個(gè)相關(guān)的 codebehind 類文件,該文件名稱的前一部分與 web 窗體相同,后面是 .vb 或 .cs(取決于項(xiàng)目使用的語(yǔ)言)。類文件將通過(guò) @ page 指令的 codebehind 和 inherits 屬性與 web 窗體相關(guān)聯(lián)。
類文件包含事件處理代碼(包括用于將事件處理程序綁定到相應(yīng)事件的代碼),以及每個(gè)控件(通過(guò) visual studio web 窗體編輯器添加到 .aspx 文件中)的分離聲明。編譯(生成)web 應(yīng)用程序項(xiàng)目后,其中的所有 codebehind 類都將編譯到一個(gè) .net 程序集中,該程序集將放置到 web 應(yīng)用程序的 /bin 目錄中。web 窗體頁(yè)本身會(huì)在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行編譯,并且每個(gè) web 窗體均繼承自與其相關(guān)的 codebehind 類。有關(guān) visual studio .net 2003 和 asp.net 1.1 中的模塊化代碼模型的詳細(xì)信息,請(qǐng)參閱 msdn library 文章 web forms code model(英文)。
雖然最初的模塊化代碼模型理論上不錯(cuò)(誰(shuí)不希望將 ui 元素與編程邏輯相分離呢?),但它還是有一些缺點(diǎn): 
需要重新生成。在 visual studio .net 中,運(yùn)行時(shí)不會(huì)自動(dòng)編譯 codebehind 類,因此對(duì) codebehind 類的任何更改都需要重新生成整個(gè)項(xiàng)目以應(yīng)用這些更改。(請(qǐng)注意,您可以通過(guò) @ page 指令的 src 屬性指定對(duì)模塊化代碼文件進(jìn)行動(dòng)態(tài)編譯,但默認(rèn)情況下 visual studio .net 不會(huì)執(zhí)行此操作。) 
共享開(kāi)發(fā)問(wèn)題。由于項(xiàng)目中的所有 codebehind 類都編譯到了一個(gè)程序集中,所以很難讓多個(gè)開(kāi)發(fā)人員同時(shí)開(kāi)發(fā)一個(gè)項(xiàng)目而不會(huì)遇到瓶頸問(wèn)題。 
代碼易被破壞。控件同時(shí)通過(guò)聲明(在 .aspx 頁(yè)面中)和編程(在 codebehind 類中)的方式存在,如果這兩組控件沒(méi)有正確同步,很容易使代碼遭到破壞。 
復(fù)雜程度增加,而且缺少單文件支持。在 visual studio .net 中,很多用于提高生產(chǎn)率的功能(包括 intellisense 語(yǔ)句完成)都需要使用模塊化代碼。遺憾的是,這些功能通常會(huì)在 codebehind 類中添加大量相對(duì)復(fù)雜的代碼,這就產(chǎn)生了代碼易被破壞的問(wèn)題,因?yàn)楦?visual studio .net 插入的代碼很容易破壞頁(yè)面。 
了解到這些缺點(diǎn)后,負(fù)責(zé)開(kāi)發(fā) asp.net 和 visual studio .net whidbey 的小組決定重新考慮模塊化代碼模型。新的模塊化代碼模型利用了 microsoft® visual basic® .net 和 c# 中稱為局部類(在 c# 中稱為局部類型)的新功能。局部類使您能夠在多個(gè)文件中定義一個(gè)類的不同部分。編譯時(shí),由編譯器將這些部分再組合到一起。asp.net whidbey 使用 @ page 指令中新的 compilewith 和 classname 屬性來(lái)標(biāo)識(shí)要與 .aspx 頁(yè)面結(jié)合的 codebehind 局部類。通過(guò)利用局部類,再進(jìn)行一些其他更改,asp.net 小組可以實(shí)現(xiàn)以下目的: 
無(wú)需在 codebehind 類中編寫(xiě)控件聲明和事件綁定代碼(在控件聲明中通過(guò)聲明的方式綁定事件)。 
允許運(yùn)行時(shí)同時(shí)對(duì) web 窗體頁(yè)和 codebehind 類進(jìn)行動(dòng)態(tài)編譯,無(wú)需再為細(xì)微的更改而重新生成整個(gè)項(xiàng)目。 
減少共享開(kāi)發(fā)中的文件爭(zhēng)用現(xiàn)象。 
對(duì)于使用模塊化代碼文件的開(kāi)發(fā)人員以及喜歡單文件開(kāi)發(fā)(所有代碼和標(biāo)記均包含在 .aspx 文件中)的開(kāi)發(fā)人員,均可獲得相同的 ide 體驗(yàn)。 
下面給出了模塊化代碼模型更改前后的不同視圖。以下代碼只是在使用模塊化代碼添加新的 web 窗體(在 visual studio .net whidbey 中稱之為具有代碼分隔的 web 窗體)時(shí),由 visual studio 創(chuàng)建的默認(rèn)代碼:
visual studio .net 2002/2003
webform1.aspx:
<%@ page language="vb" autoeventwireup="false"
 codebehind="webform1.aspx.vb" inherits="testwebapp_121602.webform1"%>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
 <head>
 <title>webform1</title>
 <meta name="generator" content="microsoft visual studio .net 7.1">
 <meta name="code_language" content="visual basic .net 7.1">
 <meta name=vs_defaultclientscript content="javascript">
 <meta name=vs_targetschema
 content="http://schemas.microsoft.com/intellisense/ie5">
 </head>
 <body ms_positioning="gridlayout"> <form id="form1" method="post" runat="server">
 </form>
 </body>
</html>
webform1.aspx.vb:
public class webform1
 inherits system.web.ui.page
#region " web 窗體設(shè)計(jì)器生成的代碼 "
 '此調(diào)用是 web 窗體設(shè)計(jì)器所必需的。
 <system.diagnostics.debuggerstepthrough()> _
 private sub initializecomponent()
 end sub
 '注意:以下占位符聲明是 
 'web 窗體設(shè)計(jì)器所必需的。
 '請(qǐng)勿刪除或改變其位置。
 private designerplaceholderdeclaration as system.object
 private sub page_init(byval sender as system.object, _
 byval e as system.eventargs) handles mybase.init
 'codegen:此方法調(diào)用是 web 窗體設(shè)計(jì)器所必需的。
 '請(qǐng)勿使用代碼編輯器修改它。
 initializecomponent()
 end sub
#end region
 private sub page_load(byval sender as system.object, _
 byval e as system.eventargs) handles mybase.load
 '此處放置用于初始化該頁(yè)面的用戶代碼
 end sub
end class
visual studio .net whidbey
default.aspx:
<%@ page language="vb" compilewith="default.aspx.vb"
 classname="asp.default_aspx" %>
<html>
<head runat="server">
 <title>無(wú)標(biāo)題頁(yè)</title>
</head>
<body>
 <form runat="server">
 </form>
</body>
</html>
default.aspx.vb:
imports microsoft.visualbasic
namespace asp
expands class default_aspx
end class
end namespace
從上面的示例可以清楚地看到,由 visual studio .net whidbey 生成的代碼更加清晰、易讀。無(wú)需犧牲拖放功能或 intellisense 來(lái)實(shí)現(xiàn)此目的。
/code 目錄
asp.net whidbey 中的另一個(gè)非常酷且實(shí)用的新功能是增加了 /code 目錄。/code 目錄與 /bin 目錄類似,是 asp.net 使用的一個(gè)特殊目錄,但它與 /bin 目錄又有所不同:/bin 目錄用于存儲(chǔ)由應(yīng)用程序使用的預(yù)編譯程序集,而 /code 目錄用于存儲(chǔ)要在運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)編譯的類文件。這使您可以將業(yè)務(wù)邏輯組件、數(shù)據(jù)訪問(wèn)組件以及其他組件的類存儲(chǔ)在應(yīng)用程序中的某個(gè)位置,并從任意頁(yè)面使用這些類。因?yàn)檫@些類是在運(yùn)行時(shí)動(dòng)態(tài)編譯的,而且會(huì)被包含 /code 目錄的應(yīng)用程序自動(dòng)引用,所以在部署項(xiàng)目之前不需要生成項(xiàng)目,也不需要明確添加類引用。您可以放心地對(duì)組件進(jìn)行更改,然后使用簡(jiǎn)單的 xcopy 或拖放操作進(jìn)行部署。除了簡(jiǎn)化組件的部署和引用外,/code 目錄還極大地簡(jiǎn)化了本地化過(guò)程中使用的資源文件 (.resx) 的創(chuàng)建和訪問(wèn)過(guò)程,以及為 wsdl 文件 (.wsdl) 自動(dòng)生成和編譯代理類的過(guò)程。
為了更好地說(shuō)明上述操作的實(shí)現(xiàn)過(guò)程,讓我們先來(lái)看幾個(gè)示例。在第一個(gè)示例中,我們將看到如何創(chuàng)建一個(gè)簡(jiǎn)單的業(yè)務(wù)組件,以及如何從 web 窗體頁(yè)對(duì)其進(jìn)行訪問(wèn)。
利息計(jì)算器
首先,我們打開(kāi) visual studio .net whidbey,創(chuàng)建一個(gè)名為 compilation 的新 web 站點(diǎn)。創(chuàng)建 web 站點(diǎn)之后,ide 應(yīng)與圖 1 類似。
圖 1:visual studio .net whidbey web 站點(diǎn)
然后,我們將 /code 文件夾添加到該 web 站點(diǎn),添加方法為右擊該項(xiàng)目,然后選擇 new folder(新建文件夾)。此文件夾必須命名為 code,但名稱不區(qū)分大小寫(xiě)。添加文件夾后,我們可以添加一個(gè)新的類文件:右擊 /code 文件夾,單擊 add new item...(添加新項(xiàng)...),然后在 add new item(添加新項(xiàng))對(duì)話框的 templates(模板)窗格中選擇 class(類)項(xiàng)。將類命名為 calculateinterest.vb。然后添加用于計(jì)算利息的代碼(將其添加到 class 和 end class 語(yǔ)句之間):
public function calcbalance(byval prncpl as integer, _
 byval rate as double, _
 byval years as integer, _
 byval period as integer) as string
 dim basenum as double = (1 + rate / period)
 calcbalance = _
 format(prncpl * system.math.pow(basenum, _
 (years * period)), "#,###,##0.00").tostring
end function
創(chuàng)建組件類后,我們需要修改 default.aspx 頁(yè)面以提供用來(lái)輸入數(shù)據(jù)的字段,還需要調(diào)用組件的 calcbalance 方法。為了簡(jiǎn)單起見(jiàn),default.aspx 的完整列表顯示如下(請(qǐng)注意,default.aspx 使用單文件代碼模型)。
default.aspx:
<%@ page language="vb" %>
<script runat="server"> 
 sub button1_click(byval sender as object, _
 byval e as system.eventargs)
 dim calc as new calculateinterest
 label6.text = "$" & _
 calc.calcbalance(convert.toint32(textbox1.text), _
 (convert.toint32(textbox2.text) / 100), _
 convert.toint32(textbox3.text), _
 convert.toint16(dropdownlist1.selectedvalue))
 label6.visible = true
 end sub
</script>
<html>
<head runat="server">
 <title> 利息計(jì)算器</title>
</head>
<body>
 <form runat="server">
 <asp:label id="label1" 
 runat="server">p本金 ($):</asp:label>
 <asp:textbox id="textbox1" runat="server">
 </asp:textbox>
 <br />
 <asp:label id="label2" 
 runat="server">利率 (%):</asp:label>
 <asp:textbox id="textbox2" runat="server">
 </asp:textbox>
 <br />
 <asp:label id="label3" runat="server">年數(shù):</asp:label>
 <asp:textbox id="textbox3" runat="server">
 </asp:textbox>
 <br />
 <asp:label id="label4" 
 runat="server">復(fù)利頻率:</asp:label>
 <asp:dropdownlist id="dropdownlist1" runat="server">
 <asp:listitem value="1">每年</asp:listitem>
 <asp:listitem value="4">每季</asp:listitem>
 <asp:listitem value="12">每月</asp:listitem>
 <asp:listitem value="365">每日</asp:listitem>
 </asp:dropdownlist>
 <br />
 <asp:label id="label5" 
 runat="server">結(jié)余: </asp:label>
 <asp:label id="label6" 
 visible="false" runat="server"></asp:label>
 <br />
 <asp:button id="button1" 
 runat="server" text="計(jì)算" onclick="button1_click" />
 </form>
</body>
</html>
在設(shè)計(jì)視圖中,修改后的 default.aspx 應(yīng)與圖 2 類似。
圖 2:設(shè)計(jì)視圖中的 default.aspx
需要注意是,當(dāng)您在用于調(diào)用組件類的 <腳本> 塊中鍵入代碼時(shí),將獲得完整的 intellisense 語(yǔ)句完成(包括組件類),如圖 3 所示。這是在 visual studio .net 2003 基礎(chǔ)上的一大改進(jìn),visual studio .net 2003 不支持服務(wù)器端 <腳本> 塊中的 intellisense。
圖 3:源視圖中的 intellisense
瀏覽 default.aspx 會(huì)生成圖 4 中所示的輸出。填入本金、利率和年數(shù),然后單擊 calculate(計(jì)算),輸出結(jié)果應(yīng)與圖 5 類似。
圖 4:default.aspx 的初始輸出
圖 5:計(jì)算后的輸出
資源文件
如果您以前在 visual studio .net 2002 或 2003 中使用過(guò) web 應(yīng)用程序,您一定已經(jīng)注意到每次創(chuàng)建新 web 窗體頁(yè)時(shí),除了 .aspx 頁(yè)以及 .vb 或 .cs 模塊化文件之外,visual studio 還會(huì)創(chuàng)建一個(gè)具有 .resx 擴(kuò)展名的匹配文件(即 webform1.aspx.resx)。與大多數(shù) web 開(kāi)發(fā)人員一樣,您可能也會(huì)忽略或試圖刪除這些文件,因?yàn)樗鼈兊挠猛竞?或用法并不是很直觀。簡(jiǎn)言之,這些 .resx 文件稱為“資源文件”,主要用于存儲(chǔ)各個(gè)版本的資源,例如用于本地化的不同語(yǔ)言的文本字符串。
在 visual studio .net 2002 和 2003 中,資源文件需要作為生成項(xiàng)目進(jìn)程的一部分添加到項(xiàng)目程序集中,并且需要導(dǎo)入兩個(gè)命名空間,創(chuàng)建一個(gè) resourcemanager 對(duì)象,并調(diào)用其 getstring 方法以訪問(wèn)資源字符串。
在 /code 目錄的幫助下,visual studio .net whidbey 中的資源訪問(wèn)過(guò)程變得非常簡(jiǎn)單,如下面的示例所示。
我們先從創(chuàng)建資源文件開(kāi)始,還是使用上一個(gè)示例中的項(xiàng)目。首先,右擊剛才創(chuàng)建的 compilation web 站點(diǎn),然后單擊 add new item...(添加新項(xiàng)...)。在 add new item(添加新項(xiàng))對(duì)話框中,選擇 assembly resource file(程序集資源文件)模板,將資源文件命名為 strings.resx,然后單擊 open(打開(kāi))。strings.resx 文件的默認(rèn)視圖應(yīng)與圖 6 類似。
圖 6:在 xml 編輯器中編輯資源文件
將以下項(xiàng)添加到數(shù)據(jù)表中(可以將“comment”(注釋)、“type”(類型)和“mimetype”(mime 類型)列保留為空):
名稱 值 
txtcolorprompt 請(qǐng)選擇一種顏色: 
txtcolorresponsered 您選擇了紅色! 
txtcolorresponsegreen 您選擇了綠色! 
txtcolorresponseblue 您選擇了藍(lán)色! 
現(xiàn)在重復(fù)上述過(guò)程,添加一個(gè)名為 strings.en-gb.resx 的新資源文件,并將以下項(xiàng)添加到其數(shù)據(jù)表中,然后保存文件(因?yàn)槲覀儧](méi)有添加 txtcolorresponse* 的項(xiàng),所以所有客戶機(jī)都將使用 strings.resx 中的這些項(xiàng)的值):
名稱 值 
txtcolorprompt 請(qǐng)選擇一種顏色: 
現(xiàn)在,為了充分利用 code 目錄的神奇作用,我們需要將這兩個(gè) .resx 文件從 web 站點(diǎn)的根目錄拖到 code 目錄中。完成上述操作后,將得到類似圖 7 的結(jié)果。
圖 7:code 目錄中的 .resx 文件
為了說(shuō)明現(xiàn)在使用創(chuàng)建的資源文件是多么簡(jiǎn)單,我們將一個(gè) web 窗體添加到項(xiàng)目中,方法如下:右擊 web 站點(diǎn)節(jié)點(diǎn),然后單擊 add new item....(添加新項(xiàng)...)。在 add new item(添加新項(xiàng))對(duì)話框中,選擇 web 窗體,將頁(yè)面命名為 colorpicker.aspx,然后單擊 open(打開(kāi))。修改此頁(yè)面,使其與以下列表匹配。
colorpicker.aspx:
<%@ page uiculture="en-gb" language="vb" %>
<script runat="server">
 
 sub page_load(byval sender as object, byval e as system.eventargs)
 label1.text = resources.strings.txtcolorprompt
 end sub
 
 sub submit_click(byval sender as object, _
 byval e as system.eventargs)
 label1.forecolor = _
 system.drawing.color.fromname(dropdownlist1.selectedvalue)
 select case dropdownlist1.selectedvalue
 case "紅色"
 label1.text = resources.strings.txtcolorresponsered
 case "綠色"
 label1.text = resources.strings.txtcolorresponsegreen
 case "藍(lán)色"
 label1.text = resources.strings.txtcolorresponseblue
 end select
 dropdownlist1.visible = false
 submit.visible = false
 end sub
</script>
<html>
<head runat="server">
 <title>顏色選取器</title>
</head>
<body>
 <form runat="server">
 <asp:label id="label1" runat="server">label</asp:label>
 <asp:dropdownlist id="dropdownlist1" runat="server">
 <asp:listitem value="red">紅色</asp:listitem>
 <asp:listitem value="green">綠色</asp:listitem>
 <asp:listitem value="blue">藍(lán)色</asp:listitem>
 </asp:dropdownlist>
 <asp:button id="submit" 
 text="提交" runat="server" onclick="submit_click" />
 </form>
</body>
</html>
當(dāng)從瀏覽器中瀏覽 colorpicker.aspx 時(shí),默認(rèn)輸出與圖 8 類似。如果從為英國(guó)用戶設(shè)置的系統(tǒng)中瀏覽此頁(yè)面(您可以通過(guò)將頁(yè)面的 uiculture 屬性設(shè)置為“en-gb”并保存頁(yè)面來(lái)模擬此情形),輸出將與圖 9 類似(請(qǐng)注意,我們已經(jīng)在“colour”中添加了 u)。
圖 8:colorpicker.aspx 的默認(rèn)輸出
圖 9:英國(guó)系統(tǒng)的 colorpicker.aspx 輸出
請(qǐng)注意,在 asp.net whidbey 中訪問(wèn)資源文件只需要一行代碼。因?yàn)閷①Y源文件放到 code 目錄中后,即可自動(dòng)嵌入和引用該資源文件,所以不需要引用任何命名空間或程序集,也不需要為訪問(wèn)資源字符串創(chuàng)建對(duì)象。而且 asp.net 還可以確定應(yīng)該使用哪個(gè)資源文件(基于用戶瀏覽器的設(shè)置),因此我們不需要在運(yùn)行時(shí)對(duì)此進(jìn)行判斷并作出相應(yīng)的響應(yīng)。asp.net 可以幫助我們完成這一切。
預(yù)編譯支持
asp.net web 窗體的優(yōu)勢(shì)之一就是增加動(dòng)態(tài)編譯后,您可以很輕松地更改 .aspx 頁(yè),保存更改時(shí)頁(yè)面將動(dòng)態(tài)更新,而不需要重新編譯(只要不使用模塊化代碼)。但動(dòng)態(tài)編譯并不是對(duì)每個(gè)應(yīng)用程序都適合,而且第一次訪問(wèn)某個(gè)應(yīng)用程序時(shí),動(dòng)態(tài)編譯會(huì)導(dǎo)致瀏覽器的初始性能降低。另外,很多時(shí)候您可能希望部署一個(gè)沒(méi)有源代碼的應(yīng)用程序。
如果您遇到上述情況,您會(huì)更高興地了解到 asp.net whidbey 具有支持預(yù)編譯 web 站點(diǎn)的功能。asp.net whidbey 支持兩種預(yù)編譯模式:在位預(yù)編譯和部署預(yù)編譯。
在位預(yù)編譯
在位預(yù)編譯使您可以對(duì) web 站點(diǎn)中的所有頁(yè)面進(jìn)行手動(dòng)批編譯。這也是用戶在您的應(yīng)用程序中首次單擊某個(gè)頁(yè)面后發(fā)生的操作(前文提到的后一種情況除外),用戶只需坐下來(lái)等待批編譯完成。 
使用在位預(yù)編譯有兩個(gè)主要原因:首先,它可以避免第一次請(qǐng)求頁(yè)面時(shí)批編譯的性能降低;其次,它使您可以“先于”用戶發(fā)現(xiàn)編譯錯(cuò)誤。
在位預(yù)編譯也很容易實(shí)現(xiàn),只需瀏覽到 web 站點(diǎn)的根目錄,添加特定的處理程序名稱 precompile.axd(熟悉 asp.net 跟蹤功能的用戶會(huì)發(fā)現(xiàn)該名稱與 trace.axd 處理程序的名稱類似):
http://localhost/mywebsitename/precompile.axd
其中 mywebsitename 是您 web 站點(diǎn)的名稱。預(yù)編譯站點(diǎn)之后,對(duì)站點(diǎn)內(nèi)頁(yè)面的請(qǐng)求也應(yīng)隨即完成,而不會(huì)有任何編譯滯后。
部署預(yù)編譯
第二種預(yù)編譯模式使您可以創(chuàng)建整個(gè) web 站點(diǎn)的可執(zhí)行版本,部署這種版本不需要任何源代碼(包括 html 和其他靜態(tài)文件)。因此,部署預(yù)編譯可以防止別人隨意訪問(wèn)由代碼表示的知識(shí)產(chǎn)權(quán)信息。生成的程序集和 stub 文件集可以通過(guò) xcopy、ftp、windows 資源管理器等部署到生產(chǎn)服務(wù)器上。
為了預(yù)編譯站點(diǎn)以進(jìn)行部署,asp.net whidbey 提供了一個(gè)名為 aspnet_compiler.exe 的命令行實(shí)用程序。要在文件系統(tǒng) web 站點(diǎn)上調(diào)用 asp.net 預(yù)編譯器,需要打開(kāi)一個(gè)命令窗口,瀏覽到 .net framework 的安裝位置(<windows>/microsoft.net/framework/<版本>),然后輸入以下命令:
aspnet_compiler /v /<websitename> -p <source> <destination>
其中 <websitename> 為 web 站點(diǎn)的名稱(即在瀏覽器中輸入的名稱),<source> 和 <destination> 為兩個(gè)文件系統(tǒng)路徑,分別指向要編譯站點(diǎn)的位置以及編譯后的版本應(yīng)輸出至的位置。以我們的 web 站點(diǎn)為例,輸入的命令如下所示(請(qǐng)注意下面是一條命令):
aspnet_compiler /v /compilation 
-p c:/websites/compilation c:/websites/compilation_compiled
如果要查看 asp.net 預(yù)編譯器的所有可用選項(xiàng),只需輸入以下命令:
aspnet_compiler /?
請(qǐng)注意,某些命令行選項(xiàng)要求 web 站點(diǎn)必須為有效的 microsoft® internet 信息服務(wù) (iis) 應(yīng)用程序才能正常工作。
如果在 microsoft® windows 資源管理器中瀏覽至目標(biāo)目錄,您會(huì)看到預(yù)編譯 web 站點(diǎn)后將生成一個(gè)包含 bin 目錄的站點(diǎn),bin 目錄中包含一些程序集和描述性文件,以及大量與原始頁(yè)面同名的 stub 文件,但不包含代碼(包括 html 和可執(zhí)行代碼)。如果瀏覽此站點(diǎn),輸出與原始站點(diǎn)的輸出相同。請(qǐng)注意,不能在已進(jìn)行部署預(yù)編譯的站點(diǎn)上使用在位預(yù)編譯,原因很簡(jiǎn)單,因?yàn)樗呀?jīng)被預(yù)編譯過(guò)了。
intellisense 無(wú)處不在!
對(duì)于 visual studio .net 2002 和 2003,最令我頭痛的問(wèn)題之一(相信很多開(kāi)發(fā)人員也有同感)就是對(duì) intellisense 和其他用于提高生產(chǎn)率的功能的支持不一致。希望在 html 視圖中將控件從工具箱中拖到頁(yè)面上嗎?還做不到。事實(shí)上,在 html 視圖中根本看不到工具箱的 web 窗體面板!要在 .aspx 頁(yè)面上寫(xiě)入內(nèi)嵌代碼而不是使用模塊化代碼?可以做到,但必須放棄 intellisense、拖放功能以及其他更多功能。最后,正如我最近在 msdn asp.net developer center 上發(fā)表的文章中提到的,在 visual studio .net 2002 或 2003 中獲得自定義控件的設(shè)計(jì)時(shí)支持需要跨越層層障礙,包括有點(diǎn)粗糙但奏效的 xsl 修改。
令人高興的是,asp.net whidbey 中實(shí)現(xiàn)了編譯模型的統(tǒng)一,所有這些問(wèn)題也都迎刃而解。在 visual studio .net whidbey 中,可以寫(xiě)入內(nèi)嵌代碼或使用新的模塊化代碼模型,還能獲得控件拖放、intellisense 語(yǔ)句完成以及所有以前您希望使用卻因編碼方式局限而無(wú)法使用的那些可以提高生產(chǎn)率的功能。另外,對(duì)自定義服務(wù)器控件和 web 控件的設(shè)計(jì)時(shí)支持有了很大的改進(jìn),包括為源視圖(html 視圖在 visual studio .net whidbey 中的等效視圖)中的自定義控件增加了 intellisense 語(yǔ)句完成。
小結(jié)
asp.net whidbey 中對(duì)編譯模型的更改,以及 visual studio .net whidbey 中相應(yīng)功能的改進(jìn)無(wú)疑是一個(gè)巨大的飛躍,不僅為開(kāi)發(fā)人員提供了所需的靈活性,還使他們可以充分利用 ide 提供的可以提高生產(chǎn)率的功能。大大簡(jiǎn)化的模塊化代碼模型將使該功能更有用、更簡(jiǎn)捷,而新增的對(duì)內(nèi)嵌代碼的完全支持顯然會(huì)受到那些希望所有代碼都位于一個(gè) .aspx 文件中的開(kāi)發(fā)人員的歡迎。
相信 /code 目錄會(huì)大大提高生產(chǎn)率,對(duì)于那些從事發(fā)展迅速的中小型項(xiàng)目的開(kāi)發(fā)人員,以及那些因?yàn)榫幾g過(guò)程過(guò)于復(fù)雜而無(wú)法完成工作的開(kāi)發(fā)人員來(lái)說(shuō)尤其如此。它還為訪問(wèn)業(yè)務(wù)邏輯組件、資源文件、wsdl 文件以及其他資源提供了一種更為直接、簡(jiǎn)單的方法:通過(guò)自動(dòng)編譯、嵌入或創(chuàng)建這些資源的代理并自動(dòng)引用它們,只需很少的代碼即可訪問(wèn)這些資源。
預(yù)編譯功能使開(kāi)發(fā)人員可以輕松地提高其站點(diǎn)的初始性能,如果需要,還可以通過(guò)提供功能完備的 web 應(yīng)用程序(不包含源代碼或 html)為重要的知識(shí)產(chǎn)權(quán)信息添加保護(hù)措施。
最后,集所有功能于一身的 visual studio .net whidbey 無(wú)疑會(huì)為開(kāi)發(fā)人員帶來(lái)非凡的體驗(yàn),他們不僅能從內(nèi)嵌代碼模型和模塊化代碼模型中獲得完全的 intellisense 支持,還能查看給定頁(yè)面的所有視圖,開(kāi)發(fā)工作不會(huì)再因工具限制而局限于某一種樣式。