FROM :
http://hi.baidu.com/2hill/blog/item/f9f1e41cb2d4be8887d6b69a.html
VS2005發布網站時不會像VS2003一樣建置規則的DLL檔案、而產生的DLL檔案名稱含有隨機數且不能一個項目產生一個DLL檔案。
所以,每次網站改動了,一發布,就要全站上傳,很不習慣,很不爽;
為了做到像vs2003一樣,聽說微軟發布了WebDeployment Project外掛程式可解決此問題,就搞了一個;安裝很簡單。
下載網址:
http://download.microsoft.com/download/c/c/b/ccb4877f-55f7-4478-8f16-e41886607a0e/WebDeploymentSetup.msi
但是發布時老是報出
"aspnet_merge.exe”已退出,代碼為1的錯誤
而且發布的DLL並沒有合成一個,還是像以前一樣,一大堆;
去網上查了一下,有的說是中文編碼問題,有的說是數組索引超出限制等;沒辦法啊,自己解決吧,但是這錯誤從哪裡找起啊;
還好,看網上有人說,將VS 2005的工具-選項-項目和解決方案-產生並運行,設定“MSBuild 項目產生輸出詳細資料”,選擇“詳細”。再次產生Web Deployment Projects項目,“輸出”框內的資訊就變得非常豐富了;這樣就可以查看哪裡出錯了;
果然,再次發布,錯誤停在了
An error occurred when merging assemblies: ILMerge.Merge: ERROR!!: Duplicate type ‘web_left’ found in assembly 'App_Web_k7ytr'
它的意思是說web_left的類,已經存在了,我去項目裡搜尋這個字串,果然,出現了四次;兩次是在cs檔案中的class定義處,另兩處自然是頁面的inherits調用處;
不用說,這是某個程式員在複製頁面時,沒有做任何改動,連cs引用也沒有改;我馬上改了,再次產生;
又停了下來,提示與前面一樣,只是類名不同罷了,看來同樣的錯誤有很多,唉,只好再改,然後再產生,根據提示,找到錯誤處,再改;產生是好慢的,搞了一個下午,全改完了;
最終,產生成功!呵呵;所有的cs產生的dll合成了一個dll;
在頁面的頭部,cs引用處,變成了
<%@ page language="C#" autoeventwireup="true" inherits="web_GovOpen_Article, BuilderWeb" enableEventValidation="false" viewStateEncryptionMode="Never" %>
注意,inherits處,引用的dll名稱,不再帶有隨機數了;
再說些其它的,在VS2005的“輸出”視窗中,還看了這樣的資訊
命令:
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_compiler.exe -v /webSite -p "D:/項目二期/webSite" -u -f -d "D:/項目二期/BuilderWeb/webRoot//"
任務“AspNetCompiler”正在使用“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_compiler.exe”中的“aspnet_compiler.exe”。
挺熟悉的,原來它是用aspnet_compiler.exe來產生的,當初自己還用它的命令列形式自己搞過呢;
再看後面
Running aspnet_merge.exe ...
命令:
C:/Program Files/MSBuild/Microsoft/WebDeployment/v8.0/aspnet_merge.exe "D:/項目二期/BuilderWeb/webRoot" -o BuilderWeb -debug -copyattrs
任務“AspNetMerge”正在使用“C:/Program Files/MSBuild/Microsoft/WebDeployment/v8.0/aspnet_merge.exe”中的“aspnet_merge.exe”。
不用問,aspnet_merge.exe的功能是合并dll檔案了;
正是因為aspx引用的cs文檔中的類重名,所以在合并時才會報錯,以前是分開在不同的dll中的,重名問題沒有暴露出來,合并了就出問題了;
現在可以明白這個“代碼為1的錯誤”了吧。