62 votes

Debug.WriteLine dans le release build

Y a-t-il un moyen d'utiliser Debug.WriteLine dans un build de version sans définir DEBUG ?

53voto

Nick Points 9187

Non, mais vous pouvez utiliser le Trace dans la version en définissant TRACE et en utilisant Trace.WriteLine. Jetez un coup d'œil ici :

http://support.microsoft.com/kb/815788

41voto

Jon Skeet Points 692016

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.

19voto

Paul Alexander Points 17611

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

3voto

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

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