65 votes

Détection programmatique du mode Release/Debug (.NET)

Duplicata possible :
Comment savoir si un assemblage .NET a été compilé avec l'option TRACE ou DEBUG ?

Duplicata possible :
Comment identifier si la DLL est de type Debug ou Release (en .NET) ?

Quel est le moyen le plus simple de vérifier par programme si l'assemblage actuel a été compilé en mode Debug ou Release ?

134voto

Davy Landman Points 9010
bool isDebugMode = false;
#if DEBUG
isDebugMode = true;
#endif

Si vous voulez programmer un comportement différent entre les versions de débogage et de publication, vous devez procéder comme suit :

#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 souhaitez effectuer certaines vérifications sur les versions de débogage des fonctions, vous pouvez procéder comme suit :

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 ne seront pas inclus dans la version finale.

0 votes

L'OP demande-t-il une construction optimisée par JIT ? Si c'est le cas, alors cette réponse est incorrecte. L'attribut Debug peut être déclaré dans un build optimisé par le JIT ou non optimisé.

15voto

J'espère que cela vous sera 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 votes

Pourquoi les deux fonctions ont cette ligne : if (attributes == null || attributes.Length == 0) return true ; Quelque chose ne va pas dans ce code. Je l'ai fait +1 car la réponse fournit un vrai moyen programmatique plutôt qu'un moyen syntaxique pour obtenir le drapeau. Parfois, il y a un besoin de savoir si nous sommes en mode débogage exprimé comme une partie du code lui-même plutôt qu'un drapeau de compilateur.

2 votes

L'attribut DebuggableAttribute est présent si vous compilez en mode Release et que vous attribuez à DebugOutput une valeur autre que "none". Cette réponse n'est donc pas correcte. Il ne recherche même pas le drapeau d'optimisation JIT. Reportez-vous à mon article sur la façon de faire la différence, à la fois manuellement et par programme. dave-black.blogspot.com/2011/12/

5 votes

Je m'en remets à @DaveB pour ce qui est des difficultés rencontrées dans le cas général. Cependant, votre question était large et, si vous souhaitez simplement que votre code se comporte différemment lorsque vous effectuez des tests, je trouve ce test utile (en VB.Net) If System.Diagnostics.Debugger.IsAttached Then DoSomething '(Such as have a Form Behave Differently)

1voto

Vimal Raj Points 645

Vous pouvez télécharger un utilitaire portable pour identifier la même chose. L'application est basée sur le post de Scott hanselman à l'adresse suivante http://tinyurl.com/ydasofx .

Le fichier de code que vous pouvez voir à http://code.google.com/p/assemblyspy/source/browse/trunk/AssemblySpy/DebugOrRelease/AssemblySpy.cs

Téléchargez l'outil ici : http://assemblyspy.googlecode.com/files/DebugOrRelease.exe

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X