2009-03-17 7 views

Répondre

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

Si vous souhaitez programmer un comportement différent entre le débogage et la libération vous Builds devriez le faire comme ceci:

#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]; 
    } 

Ou si vous voulez faire certaines vérifications sur les versions de débogage des fonctions que vous pourriez le faire comme ceci:

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; 
} 

le Debug.Assert ne sera pas inclus dans la version release.

+0

est-OP poser des questions sur JIT optimisé build? Si oui, alors cette réponse est incorrecte. L'attribut Debug peut être déclaré dans une construction JIT Optimized ou non-optimisé. –

11

J'espère que cela vous être utile:

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

Pourquoi les deux fonctions ont cette ligne: if (attributes == null || attributes.Length == 0) return true; Quelque chose ne va pas avec ce code. Je l'ai fait +1 car la réponse fournit une véritable méthode programmatique plutôt qu'une façon syntextuelle d'obtenir le drapeau. Il est parfois nécessaire de savoir si le mode de débogage est exprimé en tant que partie du code lui-même plutôt que comme indicateur de compilation. –

+1

Le DebuggableAttribute est présent si vous compilez en mode Release et choisissez DebugOutput à autre chose que "none". Donc, cette réponse n'est pas correcte. Il ne cherche même pas l'indicateur d'optimisation JIT. Reportez-vous à mon post sur la façon de faire la différence à la fois manuellement et par programme - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

I reporter à @DaveB sur les difficultés de ceci dans le cas général. Cependant, votre question était large et, si vous voulez simplement que votre code se comporte différemment lorsque vous testez, je trouve ce test utile (dans VB.Net) 'Si System.Diagnostics.Debugger.IsAttached Then DoSomething '(Tels qu'ont une forme se comportent différemment) ' –

Questions connexes