日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ASPNet_Compiler学习总结

發布時間:2025/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASPNet_Compiler学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ASPNet_Compiler的編譯過程

http://www.cnblogs.com/wonderow/archive/2008/05/01/1178294.html
最近手頭的一個ASP.Net的項目不時會出現編譯錯誤,提示某個控件ascx類不存在,但該控件明明就在同一個網站下。錯誤有時候會突然出現,而一旦出現錯誤再多次編譯也無法消除。由于公司使用腳本編譯,而不是用msbuild或Visual Studio直接編譯。事實上用Visual Studio編譯從來沒有出過錯。用ProcExp看了一下build時編譯時到底執行了什么:


aspnet_compiler.exe -d -v / -p <source webroot> <target webroot>
主要就是這一條命令。難道是編譯器有bug?再細究發現aspnet_compiler.exe又調用了csc.exe(C#編譯器):


?"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe" /noconfig /fullpaths @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\1c85b622\f7798d18\mz_xtoba.cmdline"
到Temporary ASP.NET Files\root\1c85b622\f7798d18目錄下查看,發現很多.cmdline, .err, .out, .compiled等文件,還有很多.cs文件!原來那些網頁或AppCode下的.cs文件在這里被重組并分組了:App_Code.n.cs; App_Web_<xxx>.n.cs; (n=0~...)。如果網頁比較多的話,就會有多組App_Web_<xxx>.n.cs。編譯器會一組一組地編譯n個cs文件,然后下一組的cs編譯會引用上一組編譯生成的DLL(在.cmdline里):


/t:library /utf8output /R:"System.Web.Services.dll" /R:"App_global.asax.dll" /R:"App_Web_rydiwb8f.dll" ?/out:"App_Web_bl8pd2er.dll" App_Web_bl8pd2er.9.cs App_Web_bl8pd2er.0.cs ?(已省略一些路徑和參數。這里面App_Web_bl8pd2er.dll就引用了上一組cs生成的App_Web_rydiwb8f.dll)
但怎么決定文件的分組呢,哪些文件要放在前面的組,哪里文件要放在后面?我們在.aspx.xxx.compiled或.ascx.xxx.compiled里發現了該文件依賴于哪些文件的信息:


?<?xml version="1.0" encoding="utf-8"?>
<preserve resultType="3" virtualPath="/Result.aspx" hash="84d987223" filehash="a23fecda9fe4d6d8" flags="110000" assembly="App_Web_wt3qqawy" type="ASP.result_aspx">
? ? <filedeps>
? ? ? ? <filedep name="/controls/Control1.ascx" />
? ? ? ? <filedep name="/controls/Control1.ascx.cs" />
? ? ? ? <filedep name="/Result.aspx" />
? ? ? ? <filedep name="/Result.aspx.cs" />
? ? </filedeps>
</preserve>
于是猜想編譯器就是在內存中維護用這樣的依賴關系,并可以產生一個樹來決定文件分組先后。但.compiled文件只在編譯成功那個頁面后才會生成。
明白了這些,再來找項目的問題:原來Result.aspx.cs里動態創建了Control2:


Control2 ctrl = (Control2)page.LoadControl("controls\\Control2.ascx");
page.PlaceHolder.Controls.Add(ctrl);
但在.compiled文件里看不到有這樣的依賴關系!所以編譯器不知道要把Control2.ascx分在Result.aspx的前一組。這樣就會產生有時可以編譯通過(剛好分對組了,上面的.compiled文件就是碰巧編譯成功時的樣子)有時出錯的奇怪問題。解決方案也不難,就是在Result.aspx頁面注冊一下Control2控件:
<%@ Register TagPrefix="uc1" TagName="Control2" Src="controls\Control2.ascx" %>
即使aspx頁面里沒有直接引用該控件也要加這一行,讓編譯器知道該頁面引用了控件。而文件依賴關系和.compiled文件正是使用了這個信息,編譯器根本不看.cs文件里的引用。
========

關于ASP.NET預編譯

http://www.cnblogs.com/dudu/archive/2011/02/07/aspnet_compiler_precompilation.html
為什么要用預編譯?


博客園博客程序中.aspx和.ascx文件總共加起來有3000多個(博客模板中有大量的.ascx文件)。如果使用動態編譯,每次只要更新bin文件夾中的任何一個dll文件,動態編譯至少需要5分鐘(訪問量越高,所需的編譯時間越長),而在動態編譯期間網站訪問速度極慢,幾乎就是無法正常訪問。這樣,每次更新程序成為了一種痛苦,只能安排在深夜或一大早。


面對這樣的情況,只能選擇預編譯。
預編譯的原理是什么?
請閱讀Artech寫的深入剖析ASP.NET的編譯原理之二:預編譯(Precompilation)。
如何進行預編譯?
用aspnet_compiler命令,命令示例:


aspnet_compiler -v \ -p G:\SourceWebSite G:\TargetWebsite -fixednames


參數說明:
-v \ ?要編譯的虛擬路徑,這里表示根路徑。
-p G:\SourceWebSite 要編譯的源Web項目所在文件夾。
G:\TargetWebsite 編譯目標文件夾。
-fixednames 每個.aspx與.ascx文件都編譯生成單獨的dll文件,并使用固定文件名。


編譯情況分析
1. 源文件夾中的所有.aspx, .ascx及App_Code中的.cs文件都會被編譯。


2. 編譯中遇到任何一個錯誤,會立即停止編譯,并清空目標文件夾中已生成的文件;解決了引起編譯錯誤的問題后,只能從頭重新進行編譯。出現編譯警告,只提示,不影響正常編譯。


3. 編譯完成后,aspnet_compiler會將.aspx, .ascx, .cs之外的所有文件原封不動地復制至目標文件。(如果編譯只是為了更新網站程序,這個操作顯得多余。aspnet_compiler沒有提供取消這個操作的參數)


4. 3000多個.aspx,.ascx文件,使用-fixednames編譯,耗時30分鐘左右;不使用-fixednames編譯,只要6分鐘。-fixednames編譯本來是為了更新方便(每次編譯生成的文件名相同,更新生產環境中的dll時直接覆蓋就行),沒想到這么慢。不用-fixednames編譯,每次更新時,要先刪除原來的文件,再復制。在生產環境中,這個操作會短暫影響網站的正常訪問。


5. 預編譯不會生成任何.ascx文件,也就是編譯目標文件夾中沒有任何.ascx文件。如果存在通過System.IO.File.Exists判斷.ascx文件是否存在的代碼,將不能按正常邏輯執行。解決方法是將.ascx文件復制到目標文件夾。


為什么不用“可更新的預編譯(Updatable Pre-compilation)”


Updatable Pre-compilation只編譯App_Code中的文件以及.aspx,.ascx的code behind文件,我們的Web項目類型是Web Application,code behind已經編譯了,App_Code中也沒有代碼,相當于已經處于這種編譯狀態,但還是需要至少5分鐘的動態編譯時間。


這種編譯方式只是減少了編譯.cs文件的工作量,但每個.aspx,.ascx文件還是要動態編譯,不能避免動態編譯的性能問題。


Updatable Pre-compilation適用于App_Code中有大量代碼(更新其中的文件會引起該文件夾中的所有文件重新編譯),又不想用Non-updatable Pre-compilation的情況。


結論


面對這么多的.aspx,.ascx文件,只能選擇預編譯。-fixednames編譯實在太慢,只能放棄。更新時只能先刪除,再更新。雖然有些不足,但總比動態編譯好。


當然,真正的解決之道是干掉模板中的那些.ascx文件。ASP.NET MVC會是救星嗎?
========

用aspnet_compiler發布網站



http://www.educity.cn/develop/493536.html


  在 2.0模型中,vs2005已經完全脫離了編譯而成為了一個徹底的ide.算是一個不小的改動。其中更是取消了有關Web Application的概念,使得習慣了vs2003的人剛開始的時候會有一些摸不著頭腦。下面簡單說一下我在使用過程中自己總結的,算是一點經驗。


  新建web工程并且位置是文件系統的時候,vs2005只是幫你建好了一個sln文件,這個東西只是指引msbuild 如何進行編譯的,過程是:ide 調用 msbuild ,msbuild解析sln文件,msbuild調用aspnet_compiler.exe進行網站的編譯。所以aspnet_compiler.exe只是負責進行網站的編譯的。


  預編譯的概念在framework 1.1 里面就存在了,vs2003中的預編譯指的是將頁面對應的cs/vb文件與resx文件編譯后統一集成到一個dll中放到bin目錄下,將aspx文件直接拷貝過去。這樣做會留下隱患,因為aspx文件就直接暴露在最后的發行包中,如果完全是codeb-behind模型還好,只能改改界面,如果采用了頁面上的來生成頁面,源代碼就暴露了。針對這些問題,vs2005采用了一種新的模式。


  請參看ASP.NET 編譯工具 (Aspnet_compiler.exe) 這篇文章了解對各種文件的處理方式。


  IDE發布:


  vs2005中選擇 生成-〉發布網站,在對話框中的操作將映射到aspnet_compiler.exe的參數中,可更新的發布對應 -u,其他選項類似,請參考上面的文章了解。


  注意:發布時將忽略nfig中的debug?問騁簧晌薜魘孕畔⒌奈募?


  手工編譯:


  簡單說來,如果是無更新發布模式編譯,appcode下面的class編譯成dll放在bin下,頁面內容清空位置不變作占位用,同時頁面被編譯成一個隨機名稱的dll,增加一個同piled文件到bin目錄下,內容大概如下:


  <?xml version="1.0" encoding="utf-8"?>


  <preserve resultType="3" virtualPath="/Forum/AdminList.aspx" hash="6772609c3" filehash="49154463f1d6738c" flags="110000" assembly="App_Web_hmrycg3w" type="ASP.forum_adminlist_aspx">


  <filedeps>


  <filedep name="/Controls/footer.ascx" />


  <filedep name="/Controls/header.ascx" />


  <filedep name="/Forum/AdminList.aspx" />


  <filedep name="/Forum/AdminList.aspx.cs" />


  <filedep name="/Forum/menu.ascx" />


  <filedep name="/Forum/menu.ascx.cs" />


  </filedeps>


  </preserve>


  里面只是列出了頁面上的customcontrol,這里已經完成了和masterfile的映射。這樣最大限度的保護了頁面的敏感信息,發布過的網站中只能看見一堆文件名了。可更新的發布模式與vs2003類似,頁面就直接拷貝過來不予編譯了。


  講了一堆原理,下面說一下aspnet_compiler.exe的調用方法,這是我使用的例子


  我的開發目錄是這樣的


  Project/


  library/


  devroot/


  pubroot/


  proj.sln


  使用的命令如下:


  aspnet_compiler -v / -p .\devroot -f .\pubroot


  分析:


  -v / 指明了iis的虛擬目錄


  -p .\devroot 表示代碼實際位置


  .\pubroot 指明了要發布的位置


  -f 表示強制改寫目標位置


  你還可以用-u來進行傳統意義上的預編譯,-d來插入編譯符號。
========

使用aspnet_compiler.exe預編譯網站

http://www.ixueyi.com/jingyan/103518.html


第一步:切換到aspnet_compiler.exe所在目錄
在“命令提示符”下,切換到所在目錄“c:\windows\microsoft\framework\v2.0.50727”。
第二步:運行aspnet_compiler.exe預編譯
Aspnet_Compiler -v test c:\tmp\test
-v是虛擬目錄參數,test為虛擬目錄名稱,而c:\tmp\test是指先行編譯后的程序文件的目的位置。
第三步:使用預編譯后的網站
將預編譯后的test目錄Copy到正式網頁服務器,部署網站。
但要注意:aspnet_compiler.exe不會對靜態文件如:Web.config、文本文件和圖片文件等進行編譯,所以像數據庫連接字符串請用 aspnet_regiis.exe工具來進行加密。
網站預編譯后,以后也不會觸發重新動態編譯,故請不要事后再加入新的.aspx文件,那樣不會有任何作用。
也可通過ClientBuildManager類進行編譯
string vdir = "/MyDataSource"; //虛擬目錄名稱
string srcLocation = "c:\\Inetpub\\wwwroot\\VS2005IDE"; //來源位置
string tarLocation = "c:\\tmp\\VS2005IDE"; //目標位置
System.Web.Compilation.ClientBuildManager cbm = new System.Web.Compilation.ClientBuildManager (vdir,srcLocation,tarLocation);
cbm.PrecompileApplication(); //預編譯
========

總結

以上是生活随笔為你收集整理的ASPNet_Compiler学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。