.NET:bin 與 obj,Debug 與 Release ,區別與選擇

bin 與 obj

 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目錄就是用來存放臨時文件的!

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.  數據溢出的問題

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仍是專用的等

相關文章
相關標籤/搜索