C# si/alors directives pour debug vs libération

dans les propriétés de la Solution, j'ai la Configuration définie à" release " pour mon seul et unique projet.

au début de la routine principale, j'ai ce code, et il affiche"Mode=Debug". J'ai aussi ces deux lignes en haut:

#define DEBUG 
#define RELEASE

est-ce que je teste la bonne variable?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

mon but est de définir différents paramètres par défaut pour les variables basées sur le mode de débogage vs de publication.

349
demandé sur Imad Alazani 2010-01-20 22:01:11

12 réponses

supprimer le #define DEBUG dans votre code. Définissez les préprocesseurs dans la configuration de construction pour cette construction spécifique (DEBUG/_DEBUG doit être défini dans VS déjà).

la raison pour laquelle il imprime" Mode=Debug "est à cause de votre #define et puis saute le elif .

aussi, la bonne façon de vérifier est:

#if DEBUG
    Console.WriteLine("Mode=Debug"); 
#else
    Console.WriteLine("Mode=Release"); 
#endif

Ne pas vérifier pour la VERSION

585
répondu psychotik 2010-01-20 19:05:42

par défaut, Visual Studio définit DEBUG si le projet est compilé en mode Debug et ne le définit pas s'il est en mode Release. La version N'est pas définie en Mode version par défaut. Utilisez quelque chose comme ceci:

#if DEBUG
  // debug stuff goes here
#else
  // release stuff goes here
#endif

si vous voulez faire quelque chose seulement en mode release:

#if !DEBUG
  // release...
#endif

aussi, il est intéressant de souligner que vous pouvez utiliser [Conditional("DEBUG")] attribut sur les méthodes qui retournent void pour les faire exécuter seulement si un certain symbole est défini. Le compilateur supprimerait tous les appels à ces méthodes si le symbole n'est pas défini:

[Conditional("DEBUG")]
void PrintLog() {
    Console.WriteLine("Debug info");
}

void Test() {
    PrintLog();
}
245
répondu Mehrdad Afshari 2010-01-20 19:09:39

je préfère le vérifier comme ceci vs chercher # définit:

if (System.Diagnostics.Debugger.IsAttached)
{
   //...
}
else
{
   //...
}

Avec la mise en garde que, bien sûr, vous pouvez compiler et déployer quelque chose en mode debug, mais toujours pas le débogueur.

162
répondu Joel Coehoorn 2010-01-20 19:09:59

Je ne suis pas un grand fan des trucs #if, surtout si vous les propagez tout autour de votre base de code car cela vous donnera des problèmes où les constructions Debug passent mais les constructions Release échouent si vous n'êtes pas prudent.

voici Donc ce que j'ai (inspiré par #ifdef en C# ):

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}
45
répondu Tod Thomson 2017-05-23 10:31:39

Si vous essayez d'utiliser la variable définie pour le type de construction, vous devez supprimer les deux lignes ...

#define DEBUG  
#define RELEASE 

... cela fera que le #if (DEBUG) sera toujours vrai.

il n'y a pas non plus de symbole de compilation conditionnelle par défaut pour RELEASE . Si vous voulez définir un aller dans les propriétés du projet, cliquez sur l'onglet construire puis Ajouter la version symboles de compilation conditionnelle zone de texte sous le titre général .

L'autre option serait de le faire...

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Release");
#endif
17
répondu Matthew Whited 2010-01-20 19:03:47
bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='

la méthode Debug.Assert a l'attribut conditionnel DEBUG . Si elle n'est pas définie, l'appel et l'affectation isDebug = true sont éliminé :

Si le symbole est défini, l'appel est inclus; sinon, l'appel (y compris l'évaluation des paramètres de l'appel) est omis.

si DEBUG est défini, isDebug est défini à true (et passé à Debug.Assert , qui ne fait rien dans ce cas).

14
répondu AlexD 2016-05-22 22:06:29

supprimez vos définitions en haut

#if DEBUG
        Console.WriteLine("Mode=Debug"); 
#else
        Console.WriteLine("Mode=Release"); 
#endif
7
répondu McAden 2010-01-20 19:07:10

légèrement modifié (bastardized?) version de la réponse de Tod Thomson comme une fonction statique plutôt qu'une classe séparée (je voulais pouvoir l'appeler dans une Webform viewbinding à partir d'une classe viewutils que j'avais déjà inclus).

public static bool isDebugging() {
    bool debugging = false;

    WellAreWe(ref debugging);

    return debugging;
}

[Conditional("DEBUG")]
private static void WellAreWe(ref bool debugging)
{
    debugging = true;
}
6
répondu LocalPCGuy 2014-04-23 14:45:25

espace de Noms

using System.Resources;
using System.Diagnostics;

Méthode

   private static bool IsDebug()
    {
        object[] customAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(DebuggableAttribute), false);
        if ((customAttributes != null) && (customAttributes.Length == 1))
        {
            DebuggableAttribute attribute = customAttributes[0] as DebuggableAttribute;
            return (attribute.IsJITOptimizerDisabled && attribute.IsJITTrackingEnabled);
        }
        return false;
    }
4
répondu Ehsan Enaloo 2012-05-07 14:13:23

une astuce qui peut vous faire gagner beaucoup de temps - n'oubliez pas que même si vous choisissez debug sous la configuration de construction (sur le menu vs2012/13 c'est sous BUILD => gestionnaire de CONFIGURATION) - ce n'est pas assez.

vous devez faire attention à la publication Configuration , en tant que tel:

enter image description here

2
répondu ilans 2015-07-02 05:53:28

puisque le but de ces directives de compilateur est de dire au compilateur de ne pas inclure le code, le code de débogage,le code beta, ou peut-être le code qui est nécessaire à tous vos utilisateurs finaux, à l'exception de dire ceux Le département de la publicité, c.-à-d. #Define AdDept vous voulez pouvoir les inclure ou les supprimer en fonction de vos besoins. Sans avoir à changer votre code source si par exemple un non AdDept fusionne dans L'AdDept. Alors tout ce qui doit être fait est d'inclure la directive # AdDept dans le compilateur options Propriétés page d'une version existante du programme et faire une compilation et wa la! le code du programme fusionné est vivant!.

vous pourriez également vouloir utiliser un déclaratif pour un nouveau processus qui n'est pas prêt pour les heures de grande écoute ou qui ne peut pas être actif dans le code jusqu'à ce qu'il soit temps de le libérer.

de toute façon, c'est comme ça que je le fais.

0
répondu mrMagik3805 2013-09-14 22:46:35

assurez-vous de définir la constante de débogage dans les propriétés de construction du projet. Cela activera le #if DEBUG . Je ne vois pas de constante de publication prédéfinie, donc cela pourrait impliquer que tout ce qui N'est pas dans un bloc de débogage est en mode de publication.

Define DEBUG constant in Project Build Properties

0
répondu gridtrak 2018-07-11 18:26:44