ASP.NET中怎么實(shí)現(xiàn)動(dòng)態(tài)編譯,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)10年經(jīng)驗(yàn)成就非凡,專業(yè)從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文發(fā)布平臺(tái),廣告投放等。10年來(lái)已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:13518219792,我們期待您的來(lái)電!
1.動(dòng)態(tài)編譯的過(guò)程
我們先來(lái)介紹在ASP.NET動(dòng)態(tài)編譯下的大體的執(zhí)行流程:當(dāng)ASP.NET收到一個(gè)基于某個(gè)page的request的時(shí)候,先判斷該P(yáng)age和相關(guān)的Source code是否編譯過(guò),如果沒有就將其編譯,如果已經(jīng)編譯,就是用已經(jīng)Load的Assembly直接生成Page對(duì)象。
在這里有下面幾點(diǎn)需要注意:
1). ASP.NET動(dòng)態(tài)編譯是按需編譯的,ASP.NET只會(huì)編譯和當(dāng)前Request相關(guān)的aspx和code。
2). ASP.NET動(dòng)態(tài)編譯是基于某個(gè)目錄的,也就是說(shuō)ASP.NET會(huì)把被請(qǐng)求的page所在的目錄的所有需要編譯的文件進(jìn)行編譯,并生成一個(gè)Assembly。
3). 除了編譯生成的Assembly外,動(dòng)態(tài)編譯還會(huì)生成一系列的輔助文件。
4). 對(duì)相關(guān)文件的修改,會(huì)導(dǎo)致重新編譯,但是修改對(duì)當(dāng)前的Request不起作用。也就是說(shuō)如果你對(duì)某個(gè)aspx進(jìn)行修改,那么對(duì)于修改后抵達(dá)的Request,會(huì)導(dǎo)致重新編譯,但是對(duì)于之前的Request使用的依然是原來(lái)編譯好的Assembly。
5). 編譯生成的文件被放在一個(gè)臨時(shí)目錄中,這個(gè)目錄的地址為Windows Directory\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files。其具體的目錄結(jié)構(gòu)如下圖所示:
在Temporary ASP.NET Files下的Artech.ASPNETDeployment是IIS中Virtual Directory的名稱,以下兩級(jí)目錄的名稱由Hash value構(gòu)成,所以編譯生成的文件就保存在c6f16246目錄下。這個(gè)目錄你可以通過(guò)HttpRuntime.CodegenDir獲得。
Directory\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files只是一個(gè)默認(rèn)的臨時(shí)目錄,你可以在web config中的compilation section中設(shè)置你需要的臨時(shí)目錄。
2.Sample
現(xiàn)在我用一個(gè)Sample來(lái)一探ASP.NET是如何進(jìn)行動(dòng)態(tài)編譯的。
在這個(gè)Sample中,我建立了一個(gè)Website,在根目錄下創(chuàng)建了兩個(gè)Page:Default和Default2。
在兩個(gè)子目錄Part I和Part II下分別創(chuàng)建了兩個(gè)Web page:Page1和Page2。在App_Code目錄中創(chuàng)建了一個(gè)Utility的static class。下面是它的定義:
publicstaticclassUtility { publicstaticstringReflectAllAssmebly() { StringBuilderrefllectionResult=newStringBuilder(); foreach(AssemblyassemblyinAppDomain.CurrentDomain.GetAssemblies()) { if(!assembly.FullName.Contains("App_Web")) { continue; } refllectionResult.Append(assembly.FullName+"
"); Type[]allType=assembly.GetTypes(); foreach(TypetypeInfoinallType) { refllectionResult.Append(" "+typeInfo.Name+"
"); } } returnrefllectionResult.ToString(); } }
內(nèi)容很簡(jiǎn)單,對(duì)當(dāng)前加載的所有相關(guān)的Assembly(這些Assembly的Fullname以App_Web打頭)進(jìn)行Reflection,列出所有的Type。這個(gè)ReflectAllAssmebly將在5個(gè)Web page(Default Page和兩隊(duì)Page1&Page2)的Page_Load事件中被調(diào)用。
protected void Page_Load(object sender, EventArgs e) { this.Response.Write(Utility.ReflectAllAssmebly()); }
Default是列出所有4Page對(duì)應(yīng)的Link以便我們?cè)L問它們,在我們?cè)龠M(jìn)行編譯的情況下在IE中輸入對(duì)應(yīng)的URL來(lái)訪問Default Page。(其他Page的Html中不具有真正的內(nèi)容,是一個(gè)空的page.)
通過(guò)上面的顯示,我們可以看到現(xiàn)在有一個(gè)Assembly:App_Web_wh7-uda5。該Asssembly定一個(gè)的Type有5個(gè), _Default和 default_aspx分別對(duì)應(yīng)Default Page,而Default2和 default2_aspxDefault2 Page的。FastObjectFactory_app_web_wh7_uda5是很重要的Type,我將會(huì)在后面對(duì)其進(jìn)行深入介紹。正如我們?cè)谏厦嬲f(shuō)過(guò)的,動(dòng)態(tài)編譯是按需編譯,現(xiàn)在我們對(duì)Default Page進(jìn)行訪問,由于這次對(duì)該Website的***次訪問,所有需要的Source Code,包括aspx,code behind都要進(jìn)行編譯。在這個(gè)Sample中,雖然我們并沒有訪問Default2 page,但是我們說(shuō)過(guò),ASP.NET動(dòng)態(tài)編譯是基于目錄的,由于Default Page和Default2 Page都直接置于根目錄下,所以ASP.NET會(huì)把根目錄下的所有文件編譯到一個(gè)Assembly中。由于Page1和Page2位于子目錄Part I和Part II之下,所以不會(huì)參與編譯。除非我們下載對(duì)它進(jìn)行Request。
我們現(xiàn)在來(lái)訪問Part I下的Page1和Page2看看會(huì)有什么結(jié)果。我們會(huì)發(fā)現(xiàn),兩次Request獲得的輸出是一樣的:
通過(guò)上面的輸出我們發(fā)現(xiàn),當(dāng)前AppDomain中被加載的Assembly多了一個(gè):App_Web_n1mhegpg。我們可以通過(guò)定義在該Assembly中的Type的命名可以猜出該Assembly是對(duì)Part I 目錄進(jìn)行編譯產(chǎn)生的。Page1和Page2的編譯后的Type name變成了part_i_page1_aspx& Page1和part_i_page2_aspx& Page2。此外我們看到,該Assembly中依然有一個(gè)FastObjectFactory的Type:FastObjectFactory_app_web_n1mhegpg。在這里我需要特別指出的是,名稱的后綴都是通過(guò) Hash算法得到的。
有了上面的理論和實(shí)驗(yàn)結(jié)果,我想這個(gè)時(shí)候,你肯定已經(jīng)想到,如果我現(xiàn)在對(duì)Part II的Page1和Page2進(jìn)行訪問,輸出結(jié)果會(huì)是什么樣子了。
如果這個(gè)時(shí)候,你查看臨時(shí)目錄(Directory\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files)中該Website對(duì)應(yīng)的子目錄,已將會(huì)看到生成了一些列的文件。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。