web-dev-qa-db-fra.com

Debug.WriteLine dans la build de la version

Existe-t-il un moyen d'utiliser Debug.WriteLine dans une version sans définir DEBUG?

62
Karsten

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

https://support.Microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c

52
Nick

Non. Si vous ne définissez pas le symbole du préprocesseur DEBUG, tous les appels à Debug.* Seront supprimés par le compilateur en raison de l'attribut [Conditional("DEBUG")] appliqué.

Vous voudrez peut-être envisager Trace.WriteLine ou d'autres techniques de journalisation.

41
Jon Skeet

Bien que vous ayez encore à définir DEBUG - vous n'avez pas à le faire à l'échelle de l'assemblage. Vous pouvez le définir uniquement dans les fichiers source que vous souhaitez. Donc, si vous souhaitez déboguer la journalisation à partir d'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 ); }
}
18
Paul Alexander

Oui. Vous pouvez, comme mentionné dans les commentaires ci-dessus, utiliser TRACE, ou sans définir de constantes de temps de compilation, en utilisant des 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 appeler le Debug.WriteLine à tout moment, en appelant

        compiledAction("Debug text");

Vous trompez essentiellement le compilateur en ne disposant pas d'un appel de méthode statique, mais en le construisant de manière dynamique au moment de l'exécution.

Il n'y a aucun impact sur les performances depuis, l'action est compilée et réutilisée.

C'est ainsi que j'ai écrit un DebugLogger dans SharpLog.

Vous pouvez consulter le code source ici, s'il vous intéresse: https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs

3
user3513472