2011-10-05 13 views
6

Ho un'applicazione C# che sto costruendo con Visual Studio 2010. Per aiutarmi con alcuni dei miei compiti di routine in app, ho voluto impostare alcuni valori se ho compilato l'applicazione in modalità di debug. Naturalmente, anche se le direttive del preprocessore sarebbero una buona idea. Il mio problema è che non capisco come usarli. In questo momento, ho un blocco di codice che assomiglia a questo:Utilizzando preprocessore direttive in Visual Studio 2010 con C#

#define DEBUG 

... // Other code in my app 

#if DEBUG 
    myVariable = debugValue; 
#endif 

Il mio problema è che quando compilo la mia applicazione in modalità di rilascio, myVariable viene comunque impostata su debugValue. È come se non stia definendo correttamente la mia variabile del preprocessore o non sto configurando correttamente il mio compilatore. Qualcuno può spiegarmi cosa devo fare affinché myVariable sia impostato su debugValue solo quando compilo l'app in modalità di debug?

Grazie!

risposta

11

Se si utilizza #define DEBUG per specificare il simbolo di debug, il passaggio alla modalità di rilascio sarà ancora fornire il simbolo, in quanto si sta esplicitamente definirlo.

Provare a rimuovere la linea #define DEBUG nei file di codice. Per impostazione predefinita VS definisce DEBUG e TRACE in modalità di debug e TRACE in modalità di rilascio, quindi non è necessario definirli esplicitamente.

+0

+1 per picchiarmi al pugno :) –

5

La costante DEBUG è in realtà definita nelle proprietà del progetto. Vai a Proprietà progetto-> scheda Crea-> Definisci costante DEBUG.

esplicitamente dichiarando che costante, si sta ignorando l'uno dichiarato da VS.

4

solo aggiungere poco per risposte Kyle e Steve ..

Se si apre il file Csproj con un editor di testo si può vedere come il debug della configurazione e rilasciare definire i simboli.

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

La configurazione attivo viene impostato con

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

ma come già detto Kyle suo codice essenzialmente aggiunge a tutte le configurazioni.

9

Se non siete a conoscenza di esso, si potrebbe voler controllare il "Conditional" attribute. Ciò consente di decorare un metodo piuttosto che inlining direttive del preprocessore:

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

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

Se compilate in modalità debug, il metodo log scriverà in un file. Se si sta compilando in modalità di rilascio, il metodo condizionale diventa non operativo. L'unica cosa da tenere a mente qui è che il codice condizionale lo farà nel tuo assembly, a differenza di se lo prevedi con il preprocessore - questa è una distinzione di runtime. Tuttavia, a patto che non ti dispiaccia, ho trovato questo mantiene il codice più pulito.

(Se avete intenzione di fare questo, non si vuole essere #defining o #undefining la variabile DEBUG qualsiasi punto del codice).

Problemi correlati