2008-08-26 52 views
18

多年來,我一直使用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

回答

21

的首選方法是實際使用條件屬性來包裝您的調試調用,而不是使用編譯器指令。 #if可能會變得棘手,並可能導致奇怪的構建問題。

使用條件屬性的例子如下(在C#中,但在VB.NET太工作):

[ Conditional("Debug") ] 
private void WriteDebug(string debugString) 
{ 
    // do stuff 
} 

當你編譯沒有調試標誌設置,以WriteDebug任何通話將被刪除正如在Debug.Write()中所假設的那樣。

+0

真棒...愛學習新的小技巧! – BigBlondeViking 2009-07-09 14:01:33

-6

根據我的經驗,在VB.NET中調試和發佈之間的選擇沒有區別。您可以將自定義操作添加到兩個配置中,但默認情況下我認爲它們是相同的。

使用發行版肯定不會刪除System.Diagnostics.Debug.Write語句。

+0

它們不一樣;並且由於將ConditionalAttribute應用於該方法,默認情況下釋放模式實際上將刪除對Debug.Write的調用。 – 2008-10-11 21:21:56

1

我要做的就是封裝調用調試在我自己的類,並添加一個預編譯器指令

public void Debug(string s) 
{ 
#if DEBUG 
    System.Diagnostics.Debug(...); 
#endif 
} 
1

使用DEBUG編譯符號會,就像你說的,其實忽略從組件的代碼。

我相信System.Diagnostics.Debug.Write將始終輸出到附加的調試器,即使您已經構建在發佈模式下。根據MSDN article

將有關調試的信息寫入Listeners集合中的跟蹤偵聽器。

如果你不希望任何輸出做,你需要換你的電話與像胡安的DEBUG常量Debug.Write說:

#if DEBUG 
    System.Diagnostics.Debug.Write(...); 
#endif 
1

我也讀過這篇文章,它讓我相信,當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中有所變化。

5

檢查Debug.Write方法。它標有

[Conditional("DEBUG")] 

屬性。

的MSDN幫助ConditionalAttribute狀態:

表示該方法調用 或屬性應該被忽略 除非指定條件 編譯符號定義編譯器。

構建配置是否具有釋放或調試標籤無關緊要,重要的是DEBUG符號是否在其中定義。

1

要選擇是否要調試信息進行編譯或被刪除,

進入項目的屬性窗口中的「生成」選項卡。

選擇合適的配置(主動/發行/調試/全部),並確保您 選中「DEBUG常數」如果你想要的信息, 或取消它,如果你不這樣做。

應用更改並重建

相關問題