在 模型中vs已經完全脫離了編譯而成為了一個徹底的ide算是一個不小的改動其中更是取消了有關Web Application的概念使得習慣了vs的人剛開始的時候會有一些摸不著頭腦下面簡單說一下我在使用過程中自己總結的算是一點經驗
新建web工程並且位置是文件系統的時候vs只是幫你建好了一個sln文件這個東西只是指引msbuild 如何進行編譯的過程是ide 調用 msbuild msbuild解析sln文件msbuild調用aspnet_compilerexe進行網站的編譯所以aspnet_compilerexe只是負責進行網站的編譯的
預編譯的概念在framework 裡面就存在了vs中的預編譯指的是將頁面對應的cs/vb文件與resx文件編譯後統一集成到一個dll中放到bin目錄下將aspx文件直接拷貝過去這樣做會留下隱患因為aspx文件就直接暴露在最後的發行包中如果完全是codebbehind模型還好只能改改界面如果采用了頁面上的來生成頁面源代碼就暴露了針對這些問題vs采用了一種新的模式
請參看ASPNET 編譯工具 (Aspnet_compilerexe) 這篇文章了解對各種文件的處理方式
IDE發布
vs中選擇 生成〉發布網站在對話框中的操作將映射到aspnet_compilerexe的參數中可更新的發布對應 u其他選項類似請參考上面的文章了解
注意發布時將忽略nfig中的debug?問騁簧晌薜魇孕畔⒌奈募?
手工編譯
簡單說來如果是無更新發布模式編譯appcode下面的class編譯成dll放在bin下頁面內容清空位置不變作占位用同時頁面被編譯成一個隨機名稱的dll增加一個同piled文件到bin目錄下內容大概如下
<?xml version= encoding=utf?>
<preserve resultType= virtualPath=/Forum/AdminListaspx hash=c filehash=fdc flags= assembly=App_Web_hmrycgw type=ASPforum_adminlist_aspx>
<filedeps>
<filedep name=/Controls/footerascx />
<filedep name=/Controls/headerascx />
<filedep name=/Forum/AdminListaspx />
<filedep name=/Forum/AdminListaspxcs />
<filedep name=/Forum/menuascx />
<filedep name=/Forum/menuascxcs />
</filedeps>
</preserve>
裡面只是列出了頁面上的customcontrol這裡已經完成了和masterfile的映射這樣最大限度的保護了頁面的敏感信息發布過的網站中只能看見一堆文件名了可更新的發布模式與vs類似頁面就直接拷貝過來不予編譯了
講了一堆原理下面說一下aspnet_compilerexe的調用方法這是我使用的例子
我的開發目錄是這樣的
Project/
library/
devroot/
pubroot/
projsln
使用的命令如下
aspnet_compiler v / p \devroot f \pubroot
分析
v / 指明了iis的虛擬目錄
p \devroot 表示代碼實際位置
\pubroot 指明了要發布的位置
f 表示強制改寫目標位置
你還可以用u來進行傳統意義上的預編譯d來插入編譯符號
From:http://tw.wingwit.com/Article/program/net/201311/13677.html