多年來,我一直使用VB.NET中的DEBUG編譯器常量將消息寫入控制檯。我也以類似的方式使用了System.Diagnostics.Debug.Write。總是我的理解是,當RELEASE被用作構建選項時,所有這些語句都被編譯器省略了,從而釋放了生產代碼中的調試語句開銷。最近,在使用Silverlight 2 Beta 2時,我注意到Visual Studio實際上連接到一個RELEASE構建版本,我從一個公共網站上運行並顯示我認爲甚至沒有編譯的DEBUG語句!現在,我的第一個傾向是假設我的環境出了問題,但我也想問問任何對System.Diagnostics.Debug和DEBUG構建選項有深入瞭解的人,一般情況下我可能會誤解這裏。.NET Compiler - DEBUG vs. RELEASE
回答
的首選方法是實際使用條件屬性來包裝您的調試調用,而不是使用編譯器指令。 #if可能會變得棘手,並可能導致奇怪的構建問題。
使用條件屬性的例子如下(在C#中,但在VB.NET太工作):
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
當你編譯沒有調試標誌設置,以WriteDebug任何通話將被刪除正如在Debug.Write()中所假設的那樣。
根據我的經驗,在VB.NET中調試和發佈之間的選擇沒有區別。您可以將自定義操作添加到兩個配置中,但默認情況下我認爲它們是相同的。
使用發行版肯定不會刪除System.Diagnostics.Debug.Write語句。
它們不一樣;並且由於將ConditionalAttribute應用於該方法,默認情況下釋放模式實際上將刪除對Debug.Write的調用。 – 2008-10-11 21:21:56
我要做的就是封裝調用調試在我自己的類,並添加一個預編譯器指令
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
使用DEBUG編譯符號會,就像你說的,其實忽略從組件的代碼。
我相信System.Diagnostics.Debug.Write將始終輸出到附加的調試器,即使您已經構建在發佈模式下。根據MSDN article:
將有關調試的信息寫入Listeners集合中的跟蹤偵聽器。
如果你不希望任何輸出做,你需要換你的電話與像胡安的DEBUG常量Debug.Write說:
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
我也讀過這篇文章,它讓我相信,當DEBUG沒有被定義時,在System.Debug函數中聲明的ConditionalAttribute會導致編譯器完全忽略這段代碼。對於TRACE,我認爲同樣的事情是正確的。也就是說,System.Diagnostics.Debug函數必須具有DEBUG和TRACE的ConditionalAttributes。我在這個假設上錯了。單獨的Trace類具有相同的功能,並且這些定義了依賴於TRACE常量的ConditionalAttribute。
從System.Diagnostics.Debug: _ 公共共享子寫入(_ 消息作爲字符串_ )
從System.Diagnostics程序。跟蹤: _ 公共共享子的WriteLine(_ 消息作爲字符串_ )
看來那時,我原來的設想是正確的,那System.Diagnostics.Debug(或system.Diagnostics.Trace)聲明實際上是不包含在編譯中,就好像它們包含在#IF調試(或#IF TRACE)區域中一樣。
但我也從你們這裏瞭解到,並驗證過,RELEASE構建本身並沒有考慮到這一點。至少在Silverlight項目中,這些項目仍然有點片面,您需要進入「高級編譯選項...」並確保DEBUG未定義。
我們從.NET 1.1/VS2003跳到.NET 3.5/VS2008,所以我認爲其中一些用於不同的工作,但也許它在2.0/VS2005中有所變化。
檢查Debug.Write方法。它標有
[Conditional("DEBUG")]
屬性。
的MSDN幫助ConditionalAttribute狀態:
表示該方法調用 或屬性應該被忽略 除非指定條件 編譯符號定義編譯器。
構建配置是否具有釋放或調試標籤無關緊要,重要的是DEBUG符號是否在其中定義。
要選擇是否要調試信息進行編譯或被刪除,
進入項目的屬性窗口中的「生成」選項卡。
選擇合適的配置(主動/發行/調試/全部),並確保您 選中「DEBUG常數」如果你想要的信息, 或取消它,如果你不這樣做。
應用更改並重建
- 1. Visual Studio - Debug vs Release
- 2. static libary debug vs release
- 3. Qt 5:Debug \ release和Release \ debug目錄
- 4. 調試時XCode debug vs release版本
- 5. android release apk大於debug apk
- 6. WinJS有#DEBUG或#RELEASE指令嗎?
- 7. 爲什麼Debug&Release爲.Net構建,但不適用於Java?
- 8. Bin/Debug和Bin/Release之間的區別
- 9. ant.properties vs release-signing.properties
- 10. iphone release vs testing
- 11. iPhone SDK:Dealloc vs. Release?
- 12. DEBUG VS _DEBUG
- 13. .NET 4.0 Release Candidate
- 14. 程序僅從Debug/Release目錄運行
- 15. 靜態成員變量未在Release - Compiler/clr bug中初始化?
- 16. 在.NET中,如何識別C++ DLL是否處於DEBUG或RELEASE構建中?
- 17. std :: unique_ptr :: release()vs std :: move()
- 18. 如何在Debug/Release模式下構建Sqlite二進制文件
- 19. maven-release-plugin是否也執行maven-compiler-plugin的功能?
- 20. IntelliJ + Gradle + Android。在Debug和Release buildtypes之間切換
- 21. web.config,web.debug.config,web.release.config&Publish vs Debug?
- 22. QTCreator .pro文件:根據DEBUG/RELEASE設置LIBS路徑
- 23. Flex 4.5:bin-debug可以工作,但bin-release不會
- 24. 兩個文件夾中的數據庫,bin-> debug,release
- 25. 在Delphi 7中,我可以設置'Debug'和'Release'模式嗎?
- 26. Release和Debug模式下的項目設置?
- 27. Debug和Release版本的鍵盤快捷鍵
- 28. 如何防止Cmake在EXECUTABLE_OUTPUT_PATH下創建Debug/Release文件夾?
- 29. 爲什麼Debug構建失敗而Release構建成功?
- 30. 應用程序驗證器DEBUG或RELEASE模式?
真棒...愛學習新的小技巧! – BigBlondeViking 2009-07-09 14:01:33