2009-03-17 3 views

Antwort

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

Wenn Sie ein unterschiedliches Verhalten zwischen Debug und Release programmieren Builds Sie es wie folgt tun sollten:

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

Oder wenn Sie bestimmte Prüfungen auf Debug-Versionen von Funktionen wollen Sie es tun könnte dies wie:

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

die Debug.Assert wird nicht in der Release-Version enthalten sein.

+0

die OP ist über JIT Optimierte Durch zu fragen? Wenn ja, dann ist diese Antwort falsch. Das Debug-Attribut kann in einem JIT-optimierten Build oder nicht optimiert deklariert werden. –

11

Ich hoffe, dass dies für Sie nützlich sein:

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

Warum beide Funktionen diese Zeile haben: if (attributes == null || attributes.Length == 0) return true; Something ist falsch mit diesem Code. Ich habe es +1 gegeben, da die Antwort einen echten programmatischen Weg bietet, anstatt einen syntaktischen Weg, um die Flagge zu bekommen. Manchmal muss man wissen, ob wir im Debug-Modus als Teil des Codes selbst und nicht als Compiler-Flag ausgedrückt werden. –

+1

Das DebuggableAttribute ist vorhanden, wenn Sie im Freigabemodus kompilieren und DebugOutput zu einem anderen Wert als "none" auswählen. Also, diese Antwort ist nicht korrekt. Es sucht nicht einmal nach dem JIT-Optimierungs-Flag. Siehe meinen Beitrag, wie man den Unterschied sowohl manuell als auch programmatisch erkennt - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

I verschieben Sie auf @DaveB auf die Schwierigkeiten im allgemeinen Fall. Ihre Frage war jedoch weit gefächert. Wenn Sie sich beim Testen nur wünschen, dass sich Ihr Code anders verhält, finde ich diesen Test nützlich (in VB.Net) 'If System.Diagnostics.Debugger.IsAttached Then DoSomething '(So wie eine Form sich anders verhält) –