bin 與 obj
bin 目錄:用來存放編譯的結果。 ( bin是二進制binrary的英文縮寫,因為最初C編譯的程序文件都是二進制文件 )
編譯的結果,有 Debug 和 Release 兩個版本,分別對應的文件夾為bin/Debug和bin/Release,這個文件夾是默認的輸出路徑。 (我們可以通過:項目屬性—>配置屬性—>輸出路徑來進行修改)
obj 目錄:用於存放編譯過程中生成的中間臨時文件。 ( obj是object的縮寫 )
同樣具有 debug 和 release 兩個子目錄。
debug 和 release 分別對應調試版本(debug)和發行版本(release)。
在.NET中,編譯是分模塊進行的。每次編譯時,默認都是采用增量編譯,即只重新編譯改變了的模塊,obj 目錄中保存了每個模塊的編譯結果,用來加快編譯速度。編譯整個完成后會合並為一個.DLL或.EXE保存到 bin 目錄下。
(是否采用增量編譯,可以通過:項目屬性—>配置屬性—>高級—>增量編譯來設置)
既然 obj 是中間代碼的目錄,為什嗎還要 release 呢?同理,既然 bin 是放最終代碼的目錄還要 debug 干什嗎?不是多此一舉嗎?
編譯一個源程序文件,是一個對文件多次掃描的過程,要經過語法、類型,甚至要判斷執行時的可行性等。最后還有代碼優化的過程。會有一大堆的中間文件產生。
再復雜點,一個project有圖片(聲音)等資源文件,要調用其他DLL類庫(可能是.net組件,可能是com),還可能由多個.cs文件組成。
結論:編譯需要大量的中間文件存放臨時結果,為下一步做准備。 C#是面向對象的,復雜度更高!obj目錄就是用來存放臨時文件的!
Debug 與 Release
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. 數據溢出的問題
二、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還是專用的等