2010-07-22 46 views
10

我正在編寫一個應用程序,其中我有一些調試代碼,我不想刪除,但希望在編譯發佈/發佈時修改或刪除它。例如,我想這樣的事情在一個調試版本:在C#中分離調試和發佈代碼#

...在發佈版本變成這樣:

MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

理想情況下,我希望做這樣的事情:

#if DEBUG_BUILD 
    MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
#else 
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
#endif 

我寧願不用加/我每次更改構建型時間刪除條件編譯符號在項目屬性;它應該自動發生。有沒有辦法在Microsoft Visual C#2008 Express Edition中做到這一點?謝謝。

回答

13

用途:

#if DEBUG 
    // Debug work here 
#else 
    // Release work here 
#endif 

如果你這樣做,只要確保在屬性頁打開「定義DEBUG常數」切換(編譯項目的屬性頁),它會工作。對於新的C#項目,這默認設置爲true。將由C#編譯器爲您定義(默認)爲DEBUG

0

你可以寫一個包含有條件的擴展方法,所以你並不需要保存每次

public static class ExceptionExtensions 
{ 
    public static String ToMyString(this Exception ex) 
    { 
#if DEBUG 
     return ex.ToString(); 
#else 
     return ex.Message; 
#endif 
    } 
} 

這將是我怎麼會去了解它

然後您重複它行代碼將

MessageBox.Show(ex.ToMyString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

和調試應該已經被定義

+1

Ow。這看起來像是對我的濫用擴展方法。 – 2010-07-22 17:10:54

+2

@Robert P,爲什麼? – CaffGeek 2010-07-22 17:14:03

1

有一類你可以用它來寫你的調試語句 命名空間:System.Diagnostics程序 Debug.Assert的是要使用

http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert.aspx

也看一下Debug類的所有調試什麼: http://msdn.microsoft.com/en-us/library/6x31ezs1.aspx

+0

Debug.Assert與這個問題有什麼關係? – CaffGeek 2010-07-22 17:10:41

+0

用於顯示消息不是,但如果他將代碼放入調試中,則斷言可能更有用,然後顯示消息框。我正在顯示更高級的選項,您可以使用 – greektreat 2010-07-22 17:39:05

0

我不知道快遞版本是否有這個功能,但Visual Studio已經爲您在C#中內置了這個功能。

在工具條你一定有讓你(默認)調試之間進行選擇和發佈版本的下拉列表中,調試版本定義了DEBUG符號,所以你可以使用:

#ifdef DEBUG 
    // debug code 
#endif 
13

您也可以使用此屬性。

[Conditional("DEBUG")] 

這與預處理器指令相比有兩個優點。

如果未定義條件符號,則所有對標記爲條件的方法的調用都將被替換爲Nops,這樣可以節省您不必修改對它的所有調用。

即使符號未定義,您的代碼也會檢查錯誤。 (與使用#if DEBUG時不同,編譯期間忽略#else中的代碼)

+0

這真是太棒了。 – 2010-07-22 17:37:05