2010-08-04 8 views
31

Tengo algún código que acceda a una salida API en la web. Uno de los parámetros de la API me permite hacerles saber que estoy probando.Necesita el código .NET para ejecutar solo cuando se encuentra en configuración de depuración

Me gustaría establecer solo este parámetro en mi código cuando estoy probando. Actualmente, solo comento el código cuando hago una compilación de lanzamiento.

¿Hay una forma automática de hacerlo en función de la configuración de compilación?

Respuesta

73

1: Puede utilizar Conditional atributo:

[Conditional("DEBUG")] 
static void Method() { } 

2 : #ifpreprocessor directive:

#if DEBUG 
    static int testCounter = 0; 
#endif 

3: O Debug.Write \ Debug.WriteLine método:

Debug.Write("Something to write in Output window."); 

Tenga cuidado de usar #if Directiva, ya que puede producir situaciones imprevistas en versión de lanzamiento. Por ejemplo, ver:

string sth = null; 
#if DEBUG 
    sth = "oh, hi!"; 
#endif 
    Console.WriteLine(sth); 

En este caso, no depuración acumulación imprimirá un mensaje en blanco.


Leer más:


También hay una herramienta, DebugView, que permiten capturar información de depuración de aplicaciones externas.

+0

Esos métodos 'Debug.WriteXXX' también se atribuyen con' [Conditional ("DEBUG")] '. – zwcloud

31

sí, envuelven el código en

#if DEBUG 
// do debug only stuff 
#else 
// do non DEBUG stuff 
#endif 

Google para "C# compilation symbols"

Visual Studio define automáticamente DEBUG cuando está en la configuración de depuración. Puede definir cualquier símbolo que desee (consulte las propiedades de su proyecto, la pestaña de compilación). Tenga en cuenta que abusar de las directivas de preprocesador es una mala idea, puede llevar a un código que es muy difícil de leer/mantener.

+0

¿Puede dar un ejemplo de abuso? –

+1

Una vez trabajé en un proyecto que tenía '#si VERSION_1_1 // hago las cosas específicas de la versión 1.1 #elif VERSION_2_0 #if INCLUDE_FLASH // hago las cosas específicas de flash #elif HTML_RENDERER // Cosas específicas de HTML #else /// etC# endif' por supuesto, es un comentario que no se formatea correctamente, pero se entiende la idea. Así es como decidieron mantener diferentes lanzamientos. Fue suficiente para hacer que deseara ser postal. –

+0

Ahh. Gracias por el consejo. No estoy tratando de hacer algo como eso. Creo que la bifurcación con control de fuente probablemente sería mejor en situaciones como esa. –

2
public int Method() 
{ 
#if DEBUG 
    // do something 
#endif 
} 
7

Además de las directivas #if #endif, también puede usar atributos condicionales. Si marca un método con el atributo

[Conditional("Debug")] 

Sólo se compila y se ejecuta cuando la aplicación está desarrollada en modo de depuración. Como se señaló en el comentario a continuación, estos solo funcionan cuando el método tiene un tipo de devolución de nulo.

+1

Esto solo funciona en métodos que devuelven 'void', btw. –

2

Aquí hay otro post con un resultado similar: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/

Una mejor explicación se puede ver en: http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

// preprocessor_if.cs 
#define DEBUG 
#define MYTEST 
using System; 
public class MyClass 
{ 
    static void Main() 
    { 
#if (DEBUG && !MYTEST) 
     Console.WriteLine("DEBUG is defined"); 
#elif (!DEBUG && MYTEST) 
     Console.WriteLine("MYTEST is defined"); 
#elif (DEBUG && MYTEST) 
     Console.WriteLine("DEBUG and MYTEST are defined"); 
#else 
     Console.WriteLine("DEBUG and MYTEST are not defined"); 
#endif 
    } 
} 
8

tenía este mismo problema y la solución Fui con está utilizando:

if (System.Diagnostics.Debugger.IsAttached) 
{ 
    // Code here 
} 

Esto significa que, técnicamente, en la producción se puede adjuntar un depurador y conseguir que la pieza de código para funcionar.

1

El siguiente es seguro de usar:

var isDebug = false; 
#if DEBUG 
    isDebug = System.Diagnostics.Debugger.IsAttached; 
#endif 

if (isDebug) { 
    // Do something 
} 
0

Esto funciona en asp.net:

if (System.Web.HttpContext.Current.IsDebuggingEnabled) 
    //send email to developer; 
else 
    //send email to customer; 

de Rick Strahl @Detecting-ASPNET-Debug-mode

Cuestiones relacionadas