bin 目錄:用來存放編譯的結果。 ( bin是二進制binrary的英文縮寫,由於最初C編譯的程序文件都是二進制文件 )html
編譯的結果,有 Debug 和 Release 兩個版本,分別對應的文件夾爲bin/Debug和bin/Release,這個文件夾是默認的輸出路徑。 (咱們能夠經過:項目屬性—>配置屬性—>輸出路徑來進行修改)小程序
obj 目錄:用於存放編譯過程當中生成的中間臨時文件。 ( obj是object的縮寫 )性能
一樣具備 debug 和 release 兩個子目錄。優化
debug 和 release 分別對應調試版本(debug)和發行版本(release)。ui
在.NET中,編譯是分模塊進行的。每次編譯時,默認都是採用增量編譯,即只從新編譯改變了的模塊,obj 目錄中保存了每一個模塊的編譯結果,用來加快編譯速度。編譯整個完成後會合併爲一個.DLL或.EXE保存到 bin 目錄下。spa
(是否採用增量編譯,能夠經過:項目屬性—>配置屬性—>高級—>增量編譯來設置).net
既然 obj 是中間代碼的目錄,爲什嗎還要 release 呢?同理,既然 bin 是放最終代碼的目錄還要 debug 幹什嗎?不是畫蛇添足嗎?debug
編譯一個源程序文件,是一個對文件屢次掃描的過程,要通過語法、類型,甚至要判斷執行時的可行性等。最後還有代碼優化的過程。會有一大堆的中間文件產生。設計
再複雜點,一個project有圖片(聲音)等資源文件,要調用其餘DLL類庫(多是.net組件,多是com),還可能由多個.cs文件組成。調試
結論:編譯須要大量的中間文件存放臨時結果,爲下一步作準備。 C#是面向對象的,複雜度更高!obj目錄就是用來存放臨時文件的!
release 和 debug 是不一樣的運行方式。
Visual Studio 項目對程序的發佈版本和調試版本分別有單獨的配置。
顧名思義,生成調試版本的目的是用於調試,而生成發佈版本的目的是用於版本的最終分發。
debug 會增長調試代碼,方便調試。 調試完後,用 release 版本發佈 —— 沒有調試代碼,減少程序體積,加快執行速度!
debug 調試:
你在程序中設置了斷點,爲何vs.net知道在那裏要停下來?當你把鼠標移到某個變量上,vs.net就會顯示它當時的值?—— 由於編譯器在代碼中添加了許多調試須要的代碼,可讓vs.net獲得,返回給你。
這些代碼固然是要佔用空間和時間的。
Debug 爲調試版本,其中包括了出錯時可以定位源代碼的在行,若是源文件已經改變,定位出來會有偏移,並且,在這個版本中編譯器不會進行代碼優化,
Release 發佈:
在你的程序調試完了後,能夠正確運行了。徹底能夠去掉這些代碼,這時候就應該用 Release 模式了。
Release 爲正試版本,程序出錯只是進行簡單的錯誤處理,編譯器會優化代碼,以提升性能。
Release 代碼更小,執行更快,編譯更嚴格,編譯的過程也更慢。
編譯:
無論 Debug 仍是 Release 模式,都要編譯(一個用於調試,一個用於發佈),兩種模式編譯的結果,分別放在 bin 目錄下的 Debug 和 Release 文件夾中。
兩種模式在編譯的過程當中都有中間臨時代碼產生,因此 obj 目錄下也有 debug、release 目錄,分別用於存放兩種模式編譯過程當中生成的中間臨時代碼。
編譯完後,中間臨時代碼是沒什麼用的了,因此通常無論obj目錄裏的東西!
常常你會遇到 Debug 成功,可是 Release 版本就有問題,如下是問題的分析總結、Debug 和 Release 版本差別及調試相關問題:
1、內存分配問題
一、變量未初始化。
下面的程序在debug中運行的很好。
thing * search(thing * something) BOOL found; for(int i = 0; i < whatever.GetSize(); i++) { if(whatever[i]->field == something->field) { found = TRUE; break; } } if(found) return whatever[i]; else return NULL;
而在release中卻不行,由於debug中會自動給變量初始化found=FALSE,而在release版中則不會。因此儘量的給變量、類或結構初始化。
2. 數據溢出的問題
2、DLL的災難
人們將不一樣版本DLL混合形成的不一致性形象的稱爲 「動態鏈接庫的地獄「(DLL Hell) ,甚至微軟本身也這麼說(http://msdn.microsoft.com/library/techart/dlldanger1.htm)。
若是你的程序使用你本身的DLL時請注意:
1. 不能將 debug 和 release 版的 DLL 混合在一塊兒使用。debug 都是 debug 版,release 版都是 release 版。
解決辦法是將 debug 和 release 的程序分別放在主程序的 debug 和 release 目錄下
更多參考:
https://www.cnblogs.com/Interkey/p/3554588.html
https://www.cnblogs.com/lxconan/p/difference-between-debug-and-release-build-on-speed.html
PRoperties 文件夾以及各類後綴文件的所表示的意思
PRoperties文件夾:定義你程序集的屬性。(項目屬性文件夾,通常只有一個 AssemblyInfo.cs 類文件,用於保存程序集的信息,如名稱,版本等,這些信息通常與項目屬性面板中的數據對應,不須要手動編寫)
.cs :類文件。 源代碼都寫在這裏,主要就看這裏的代碼。 .resx :資源文件。 一些資源存放在這裏,通常不須要看。 .csproj :C#項目文件。 用VS打開這個文件就能夠直接打開這個項目,自動生成,不須要看。 .csproj.user 是一個配置文件,自動生成的,會記錄項目生成路徑、項目啓動程序等信息。也不須要看。 .Designer.cs 設計文件,自動生成,不須要看。 .aspx 是網頁文件,HTML代碼寫在這裏面。 sln:在開發環境中使用的解決方案文件。它將一個或多個項目的全部元素組織到單個的解決方案中。此文件存儲在父項目目錄中.解決方案文件,他是一個或多個.proj(項目)的集合 *.sln:(Visual Studio.Solution) 經過爲環境提供對項目、項目項和解決方案項在磁盤上位置的引用,可將它們組織到解決方案中。 好比是生成Debug模式,仍是Release模式,是通用CPU仍是專用的等