2011-10-05 21 views
6

Tengo una aplicación C# que estoy creando con Visual Studio 2010. Para ayudarme con algunas de mis tareas rutinarias en la aplicación, quería establecer algunos valores si compilé la aplicación en modo de depuración Naturalmente, pensé que las directivas de preprocesador serían una buena idea. Mi problema es que no entiendo muy bien cómo usarlos. En este momento, tengo un bloque de código que se parece a esto:Uso de Directivas de preprocesador en Visual Studio 2010 con C#

#define DEBUG 

... // Other code in my app 

#if DEBUG 
    myVariable = debugValue; 
#endif 

Mi problema es que cuando compilo mi aplicación en modo de lanzamiento, myVariable todavía se establece en debugValue. Es como si no estuviera definiendo correctamente mi variable de preprocesador o no estoy configurando mi compilador correctamente. ¿Alguien puede explicarme qué debo hacer para que myVariable solo esté configurado para depurarValor cuando compilo la aplicación en modo de depuración?

¡Gracias!

Respuesta

11

Si está utilizando #define DEBUG para especificar el símbolo de depuración, cambiar al modo de lanzamiento seguirá proporcionando el símbolo, ya que está definiéndolo explícitamente.

Intente eliminar la línea #define DEBUG en los archivos de código. Por defecto VS define DEBUG y TRACE en modo de depuración y TRACE en modo de lanzamiento, por lo que no es necesario definirlos explícitamente.

+0

+1 por golpearme al golpe :) –

5

La constante DEBUG se define realmente en las propiedades de su proyecto. Vaya a Propiedades del proyecto-> pestaña Construir-> Definir constante DEBUG.

Al declarar explícitamente esa constante, está anulando la declarada por VS.

4

sólo para añadir poco a Kyle y respuestas de Steve ..

Si abre el archivo de .csproj con un editor de texto se puede ver cómo la depuración de la configuración y liberación de definir los símbolos.

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

La configuración activa se establece con

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

pero como ya se ha mencionado Kyle su código en esencia lo añade a todas las configuraciones.

9

Si no está enterado, puede consultar el "Conditional" attribute. Esto le permite decorar un método en lugar de inclusión entre líneas directivas del preprocesador:

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

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

Si estás compilando en modo de depuración, el método de registro se escribe en un archivo. Si está compilando en modo de lanzamiento, el método condicional se convierte en no operativo. Lo único a tener en cuenta aquí es que el código condicional lo convertirá en su ensamblaje, a diferencia de si lo reemplaza con el preprocesador; esta es una distinción de tiempo de ejecución. Sin embargo, siempre y cuando no te importe, he descubierto que esto mantiene el código más limpio.

(Si va a hacer esto, no desea #definir o #definir la variable DEBUG en ningún lugar de su código).