VS2008 在發布網站時,bin 目錄裡為所有 cs 產生的 dll 檔案每次都是隨機命名的,像這樣子的 App_Web_g2dnx-qj.dll, App_Web_s9nor8mv.dll,這樣對更新 Live 網站很不方便,因為動態庫名變了,涉及到每一個 aspx 檔案每次都重新更改了對庫的引用聲明:
<%@ page language="C#" autoeventwireup="true" inherits="_Default, App_Web_s9nor8mv" %>
即使有一個 cs 的小改動,由於產生的動態庫名稱不一樣,造成所有的 aspx 檔案都得重傳一遍。如果能固定動態庫的檔案名稱,更新網站時就省事多了,只改了 cs 的話,重建 dll 檔案,只需要替換這一個 dll 檔案就 OK 啦。我們可以找到幾種做法:
1. 在“發布網站”的選項中,勾選“使用固定命名和單頁程式集”,每個頁面對應的一個 dll,並且這個 dll 檔案名稱是固定的(名字雖然看起來很隨便),只要 aspx 檔案名稱沒變。這會產生大量的 dll 檔案,實際應用中還沒看到可取之處。
2. 把所有的 cs 檔案放到 App_Code 目錄中,這樣所有的 cs 每次都產生到 App_Code.dll 動態庫中。這時候的 aspx 檔案第一行指令在建立後要更改為:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="_Default" %>
或者:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="_Default, App_Code" %>
這樣發布的時候,對 cs 的小改動只需替換一個 App_Code.DLL 檔案即可。在不使用 CodeFile 屬性時,VS 沒理由要修改你的 aspx 檔案頭。
3. 第三種辦法,其實與前一種十分類似,如果覺得把 aspx 對應的 cs 檔案放到 App_Code 目錄中有點唐突,那麼為當前解決方案新加一個 Class Library 項目,例如 ClassLibrary1,把 aspx 的 cs 檔案都放到這個工程中吧,相應的 aspx 檔案指令就是:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="_Default" %>
或者:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="_Default, ClassLibrary1" %>
小改動替換 ClassLibrary1.dll 即可,同理在不使用 CodeFile 屬性時,VS 沒理由要修改你的 aspx 檔案頭。只有 cs 檔案也要放伺服器上,由 Asp.Net 來編譯器時,CodeFile 指令才是有其作為的。
4. Web Deployment Projects with Visual Studio 2008:
http://download.microsoft.com/download/0/5/b/05b4424b-5b9b-4961-8ec6-91e9f1741b2d/WebDeploymentSetup.msi,安裝檔案十分小, 686K。
簡單操作如下:
1) 下載後直接安裝,安裝完後開啟VS2008;
2) 在[產生]->[發布網站]下面會多出一項[Add Web Deployment Project], 也可在要發布的網站項目上點右鍵.直接選取[Add Web Deployment Project],彈出屬性對話方塊後. 設定好指定名稱(如 WebSite1_deploy)和存放目錄(c:\target), 添加後,
以看到當前解決方案中多了一項( WebSite1_deploy), WebSite1_deploy 有很多其它屬性可以設定,其中有一重要的預設選項:
Merge all outputs to a single assembly
Assembly name: 是 WebSite1_deploy.
3) 在剛添加的方案中點右鍵->[產生], 或者是對 WebSite1_deploy 進行 Build 都會在前面指定的目錄(c:\target) 中產生可發布的檔案的目錄了。進到 c:\target 目錄中,翻一下你就會發現你的 Web 項目中所有的 cs 檔案,包括 aspx 關聯的和 App_Code 中的 css 檔案都編譯到 WebSite1_deploy.DLL 檔案中去了。aspx 檔案的頭部是:
<%@ page language="C#" autoeventwireup="true" inherits="Default, WebSite1_deploy" %>
只要 WebSite1_deploy.DLL 檔案名是固定的,aspx 的聲明部分也總是不變的,所以每次只是對 cs 檔案的修改補,只需換個 WebSite1_deploy.DLL 檔案就行啦。
相比於第二、三種方法,只需一次設定,用不著每建一個 aspx 檔案對代碼檔案進行搬動,還得改改 aspx 檔案的聲明部分,而且對於 Web Site 也能構建出 DEBUG 的版本出來,所以這應該是終極的。
參考:1. VS2008發布、產生網站時如何設定固定的dll檔案名稱?
2. 巧用VS2005解決VS2005網站發布不便問題