Y a-t-il un moyen d'utiliser Debug.WriteLine
dans un build de version sans définir DEBUG
?
Réponses
Trop de publicités?Non. Si vous ne définissez pas le DEBUG
le symbole du préprocesseur, tout appel à Debug.*
sera supprimé par le compilateur en raison de l'option [Conditional("DEBUG")]
qui est appliqué.
Vous pouvez envisager Trace.WriteLine
ou d'autres techniques d'enregistrement.
Bien que vous deviez toujours définir DEBUG, vous n'êtes pas obligé de le faire au niveau de l'assemblage. Vous pouvez le définir uniquement dans les fichiers sources que vous souhaitez. Ainsi, si vous souhaitez que la journalisation du débogage soit assurée par une classe particulière, vous pouvez définir DEBUG uniquement pour ce fichier source.
#define DEBUG
using System.Diagnostics;
...
class Logger
{
void Log( string msg ){ Debug.WriteLine( msg ); }
}
Oui. Vous pouvez, comme mentionné dans les commentaires ci-dessus, utiliser TRACE, ou sans définir aucune constante de compilation, en utilisant les arbres d'expression.
var p = Expression.Parameter(typeof(string), "text");
var callExp =
Expression.Call(
typeof(System.Diagnostics.Debug).GetRuntimeMethod(
"WriteLine", new [] { typeof(string) }),
p);
Action<string> compiledAction = Expression.Lambda<Action<string>>(
callExp, p)
.Compile();
Après cela, vous pouvez invoquer Debug.WriteLine à tout moment, en appelant
compiledAction("Debug text");
Ce que vous faites essentiellement, c'est tromper le compilateur en n'ayant pas d'appel de méthode statique, mais en le construisant dynamiquement à l'exécution.
Il n'y a pas de perte de performance puisque l'action est compilée et réutilisée.
Voici comment j'ai écrit un DebugLogger dans SharpLog.
Vous pouvez jeter un coup d'œil au code source ici, si cela vous intéresse : https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs