2009-03-17 8 views

Respuesta

97
Boolean isDebugMode = false; 
#if DEBUG 
isDebugMode = true; 
#endif 

Si desea programar un comportamiento diferente entre la depuración y las versiones de lanzamiento debe hacerlo de esta manera:

#if DEBUG 
    int[] data = new int[] {1, 2, 3, 4}; 
#else 
    int[] data = GetInputData(); 
#endif 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 

O si usted quiere hacer cierto control de versiones de depuración de las funciones que podría hacerlo de esta manera:

public int Sum(int[] data) 
{ 
    Debug.Assert(data.Length > 0); 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 
    return sum; 
} 

el Debug.Assert no se incluirán en la versión de lanzamiento.

+0

¿Es el OP preguntando por JIT optimizado acumulación? Si es así, entonces esta respuesta es incorrecta. El atributo Debug se puede declarar en una versión optimizada de JIT o no optimizado. –

11

espero que esto sea útil para Usted:

public static bool IsRelease(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if ((d.DebuggingFlags & DebuggableAttribute.DebuggingModes.Default) == DebuggableAttribute.DebuggingModes.None) 
     return true; 

    return false; 
} 

public static bool IsDebug(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if (d.IsJITTrackingEnabled) return true; 
    return false; 
} 
+4

por qué ambas funciones tienen esta línea: if (atributos == null || attributes.Length == 0) return true; Algo está mal con este código. Hice +1 dado que la respuesta proporciona una forma programática real en lugar de una forma sintetizada para obtener la bandera. en algún momento hay una necesidad de saber si está en modo de depuración expresarse como parte del código en sí mismo y no como un indicador del compilador. –

+1

DebuggableAttribute está presente si compila en modo Release y elige DebugOutput en cualquier otra cosa que no sea "none". Entonces, esta respuesta no es correcta. Ni siquiera busca la bandera de Optimización JIT. Consulte mi publicación sobre cómo diferenciar tanto manual como programáticamente - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

I aplazar a @DaveB sobre las dificultades de esto en el caso general. Sin embargo, su pregunta era amplia y, si simplemente desea que su código se comporte de manera diferente cuando realiza la prueba, esta prueba le resulta útil (en VB.Net) 'If System.Diagnostics.Debugger.IsAttached Then DoSomething '(Tales como tener una forma se comporta de manera diferente) ' –

Cuestiones relacionadas