作用
“csproj檔案究竟是做什麼用的”
csproj檔案 是“C Sharp Project”的縮寫。
那么它究竟是給誰用的呢?那是給開發工具用的,例如我們再熟悉不過的Visual Studio,以及大家可以沒有接觸過,但是應該都聽說過的MSBuild.exe。Visual Studio會根據csproj里的XML定義來管理項目檔案以及相關其他一些種類非常豐富的數據及操作,MSBuild也會根據csproj檔案來得知編譯這個項目需要有哪些依賴,默認輸出路徑,Pre-Build和Post-Build需要哪些操作等等。Visual Studio和MSBuild都是開發工具,這就是csproj存在的唯一意義:為“開發環境”提供信息。而到了運行環境中,根本不會有人(作業系統?)關心所謂的csproj檔案——也就是“程式是哪裡來的”。
如果是個可執行程式,作業系統需要的只是exe,dll,甚至是配置檔案或資源檔案,而並非在開發中舉足輕重的csproj,sln,dbproj等檔案。而像IIS這樣的運行環境,更加不會去關注csproj的影子:“csproj是什麼?”IIS輕蔑地說,“我只聽web.config的說法”。在運行環境中,csproj的輝煌不在——這是自然,你有辦法向我們的IIS證明它使用的dll在開發期是由csproj,sln等檔案來“統領”的嗎?現在說到之前提到的“pdb檔案需要放在Debug目錄下才有效果”,其實不然。Debug目錄只是VS的模板所“默認存在”的編譯規則所生成的目錄而已,我們在調試時使用pdb檔案完全可以由VS指定pdb檔案存在的目錄——甚至我們根本不需要VS也能使用pdb檔案。
說到了“模板”,這其實又是“開發環境”的概念。我們在VS中選擇New Item或New Project時,可以在彈出視窗的左邊找到模板的分類,而右邊則是一堆可用的模板。這些模板是哪來的呢?自然是人為生成給VS用的,您不妨看看自己My Documents\Visual Studio 2008\Templates目錄下是否存在一些zip檔案,那就是存放“My Templates”的壓縮檔,感興趣的朋友可以學習一下如何建立一個模板。而在“運行環境”下,更不會知道開發中用了什麼模板。不知您是否提過這樣的問題:“為什麼Web Site中無法使用ASP . NET AJAX,而Web Application就可以?”現在您應該已經知道了,運行時期的問題和Web Site、Web Application與否沒有任何關係。那么是如何產生這個問題的呢?看看您的Web.config?看看頁面上提示了什麼信息?用Fiddler看看請求的輸出是什麼?其實在很多時候“排錯”並沒有什麼妙法,唯“仔細”二字。
而且事實上,“模板”在開發環境中的“地位”比csproj檔案都要低,因為只要通過模板創建好內容之後,就無法說明結果和自己有什麼聯繫了。例如我們使用模板創建一個AjaxControlToolkit的Extender,其中會生成一個.cs,一個.designer.cs和一個js檔案——呵呵,誰還能證明這三個檔案不是我們手動創建的呢?這就是“開發環境”,一切都是為了開發效率的提高,一切都是為了能夠最終產生一個可執行的二進制檔案。而在開發環境的最後一個成員“編譯器”工作完成之後,所有開發工具便默默地退居二線。