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.
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
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();
}
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.
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;
}
}
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
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).
supprimez vos définitions en haut
#if DEBUG
Console.WriteLine("Mode=Debug");
#else
Console.WriteLine("Mode=Release");
#endif
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;
}
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;
}
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:
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.
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.