2012-12-21 83 views
25

其他指令的#if預處理指令我知道,我可以這樣使用預處理指令檢查調試/發佈:比DEBUG

#if DEBUG 
    //debug mode 
#elif 
    //release mode 
#endif 

但有關檢查其他配置一樣,考什麼。在VB中,你可以這樣做:

#If CONFIG = "Release" Then 
    'Release mode 
#ElseIf CONFIG = "Test" Then 
    'Test mode 
#ElseIf CONFIG = "Debug" Then 
    'Debug mode 
#End If 

所以,我的問題是在C#中,我該如何檢查測試模式?我有一些我想要執行的代碼,如果我在Debug AND Test中,但不是在Release模式下,所以我需要一種方法來檢查是否處於Release模式。在VB我這樣做:

#If Not CONFIG = "Release" Then 
    'Do something here for every configuration that is not Release 
#End If 

回答

39

這是爲DEBUG相同,假設你已經定義了一個構建配置,在「條件編譯符號」文本框中列出TEST(下項目屬性>生成選項卡;這是一個空格分隔的列表)。

對於代碼,您只需要在測試版本的配置中運行:

#if TEST 
// ... 
#endif 

而且代碼你不希望在測試版本配置上運行,你可以#else以上兩種,或做這:

#if !TEST 
// ... 
#endif 
+6

我沒有了解如何在Build選項卡下設置Conditional編譯符號。這正是我所期待的!謝謝!解釋如何設置符號+1。 –

4

有幾種方法來處理你的因素。在我的世界裏,我們用四個主要技術:

  1. 編譯器標誌(#if
  2. 部分類
  3. 單獨實現
  4. 運行時決定

因此,例如,我們已經建立的配置for,具有非託管代碼的C#,具有所有託管代碼的C#,針對silverlight的C#。在C#非託管項目中,我們有一個編譯時符號UNMANAGED,對於C#我們有MANAGED,對於silverlight我們有SILVERLIGHT。這讓我可以將小任務注入代碼並在所有項目中共享相同的文件。沒什麼大不了。

對於部分類,我們爲每個具有附加代碼實現的項目分別創建了.cs文件。在我們無法通過將抽象類作爲父類實現大多數實現,然後在每個目標的具體類中使用邊緣代碼的情況下,我們無法做到這一點。這工作得很好。

對於單獨的實現,我們承認在代碼庫之間可以共享的東西很少,而且我們最好使用單獨的代碼。這並不理想,但如此吧。

對於運行時檢查,就是這樣。 #if中不使用DEBUG進行檢查,而是使用運行時檢查設置進行選擇。除非你有非常大的調試腳手架,否則這不是一個不錯的選擇,因爲它也可以讓你進行現場調試(但你可能有交付限制來阻止它)。

就我個人而言,我儘量避免編譯器標誌。他們使代碼難以閱讀。老實說,有些時候它們是有意義的。我們已經有了不能僅僅因爲類聲明而編譯Silverlight的類(我認爲它是ObservableCollection不可用),我們不得不從其他東西繼承。其他一切正常。

+0

感謝分享。 –

1

簡單的答案是

  • 轉到項目 - > [項目名稱]屬性 - >建設
  • 設置檢查[]定義DEBUG

現在你可以用DEBUG前任指令喜歡玩

#if DEBUG 
... 
#else 
... 
#endif 
3

右鍵單擊要使用cust的Project [Project name]名稱om預編譯器指令。

轉到屬性項,然後到生成選項卡。

那麼你需要在文本框中添加自定義指令。例如,我添加了「本地」作爲我的自定義指令見下文

enter image description here

像現在,你可以可以用在你的下面顯示的新的編譯器指令(在C#)

#if **Local** 
    //TODO:Add your c# code here 
    #endif 
+1

我們可以爲每個用戶配置而不是項目配置 –