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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM