2011-10-05 159 views
6

我有一個與Visual Studio 2010一起構建的C#應用​​程序。爲了幫助我處理應用程序中的一些日常任務,我想在編譯應用程序時設置一些值在調試模式下。當然,我通過預處理指令是一個好主意。我的問題是,我不太明白如何使用它們。在這個時候,我有一段代碼,看起來像這樣:在C#中使用Visual Studio 2010中的預處理器指令

#define DEBUG 

... // Other code in my app 

#if DEBUG 
    myVariable = debugValue; 
#endif 

我的問題是,當我編譯我的應用程序在發佈模式,MYVARIABLE仍然被設置爲debugValue。這就像我沒有正確定義我的預處理器變量或我沒有正確配置我的編譯器。任何人都可以向我解釋我需要做什麼,以便在調試模式下編譯應用程序時myVariable僅設置爲debugValue?

謝謝!

回答

11

如果您使用#define DEBUG來指定調試符號,切換到發佈模式仍然會提供符號,因爲您明確定義它。

嘗試在您的代碼文件中刪除#define DEBUG行。默認情況下,VS在調試模式下定義了DEBUGTRACE,在發佈模式下定義了TRACE,所以不需要明確定義它們。

+0

+1打我的拳頭:) –

5

DEBUG常量實際上是在您的項目屬性中定義的。轉到項目屬性 - >生成選項卡 ​​- >定義DEBUG常量。

通過顯式聲明該常量,您重寫了由VS聲明的那個常量。

4

如果你打開你的.csproj文件使用文本編輯器,你可以看到如何配置的調試和Release定義符號我想補充一點凱爾和史蒂夫的答案..

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 
    ... 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    ... 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 
    ... 
    <DefineConstants>TRACE</DefineConstants> 
    ... 
    </PropertyGroup> 

的活動配置設置與

<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> 

但凱爾已經提到你的代碼基本上是把它添加到所有配置。

9

如果你不知道它,你可能想看看"Conditional" attribute。這可以讓你裝飾的方法,而不是內聯預處理指令:

class SomeClass 
{ 
    public void ProductionOperation() 
    { 
     //Doin' production stuff 
     Log(someProductionVariable); 
    } 

    [Conditional("DEBUG")] 
    public static void Log(string message) 
    { 
     //Write to a file 
    } 
} 

如果你在調試模式下進行編譯,該日誌方法寫入文件。如果您在發佈模式下編譯,則條件方法將變爲空操作。這裏唯一需要注意的是,條件代碼會將它加入到你的程序集中,而不像你用預處理器搶佔它 - 這是一個運行時區別。但是,只要您不介意,我發現這可以讓代碼更清潔。

(如果你打算這樣做,你不想在代碼中的任何地方#defining或#undefining DEBUG變量)。