web-dev-qa-db-fra.com

Besoin de code .NET pour s'exécuter uniquement en configuration de débogage

J'ai du code qui accède à une API sur le Web. L'un des paramètres de l'API me permet de leur faire savoir que je teste.

Je voudrais définir ce paramètre dans mon code uniquement lorsque je teste. Actuellement, je commente simplement le code lorsque je crée une version. 

Existe-t-il un moyen automatique de procéder basé sur la configuration de construction?

31
Ronnie Overby

Solutions

Vous pouvez utiliser l'un des éléments suivants—

1: attribut Conditional

L'attribut Conditional indique aux compilateurs qu'un appel de méthode ou un attribut doit être ignoré sauf si un symbole de compilation conditionnel spécifié est défini.

Exemple de code:

[Conditional("DEBUG")]
static void Method() { } 

2: directive __processeur #if

Lorsque le compilateur C # rencontre une directive #ifpreprocessor , suivie d'une directive #endif, il compile le code entre les directives uniquement si le symbole spécifié est défini. Contrairement à C et C++, vous ne pouvez pas affecter de valeur numérique à un symbole. L'instruction #if en C # est booléenne et teste uniquement si le symbole a été défini ou non.

Exemple de code:

#if DEBUG
    static int testCounter = 0;
#endif 

3: méthodes Debug.Write

Debug.Write (et Debug.WriteLine ) écrit des informations sur le débogage dans les écouteurs de trace dans la collection Auditeurs .

Voir aussi Debug.WriteIf et Debug.WriteLineIf .

Exemple de code:

Debug.Write("Something to write in Output window.");

Remarques

Méfiez-vous de la directive #if car elle peut générer des situations inattendues dans Release build. Par exemple, voir:

    string sth = null;
#if DEBUG
    sth = "oh, hi!";
#endif
    Console.WriteLine(sth);

Dans ce cas, la construction non-Debug imprimera un message vierge. Mais, cela peut potentiellement générer NullReferenceException dans un cas différent.

Lire la suite

Voir également

Il existe également un outil, DebugView , qui permet de capturer des informations de débogage à partir d’applications externes.

80
Dariusz Woźniak

oui, envelopper le code 

#if DEBUG
// do debug only stuff 
#else
// do non DEBUG stuff
#endif

Google pour "Symboles de compilation C #"

Visual Studio définit automatiquement DEBUG lorsque vous vous trouvez dans la configuration de débogage. Vous pouvez définir les symboles de votre choix (consultez les propriétés de votre projet, l'onglet Construction). Attention, abuser des directives du préprocesseur est une mauvaise idée, cela peut conduire à un code très difficile à lire/maintenir.

31
Matt Greer

J'ai eu le même problème et la solution que j'ai choisie consiste à utiliser:

if (System.Diagnostics.Debugger.IsAttached)
{
    // Code here
}

Cela signifie que techniquement, en production, vous pouvez attacher un débogueur et exécuter ce morceau de code.

12
James Hulse

En plus des directives #if #endif, vous pouvez également utiliser des attributs conditionnels. Si vous marquez une méthode avec l'attribut

[Conditional("Debug")]

Il ne sera compilé et exécuté que lorsque votre application sera créée en mode débogage. Comme indiqué dans le commentaire ci-dessous, ceux-ci ne fonctionnent que lorsque la méthode a un type de retour vide.

7
George Johnston
public int Method ()
{
#if DEBUG 
   // do something 
#endif
}
2
David_001

Voici un autre article avec un résultat similaire: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/

Une meilleure explication peut être vue à: http://msdn.Microsoft.com/en-us/library/4y6tbswk.aspx

// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#Elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#Elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}
2
Edward Leno

Ce qui suit est sûr à utiliser:

var isDebug = false;
#if DEBUG
    isDebug = System.Diagnostics.Debugger.IsAttached;
#endif

if (isDebug) {
    // Do something
}
1
Jason Williams

Cela fonctionne dans asp.net:

if (System.Web.HttpContext.Current.IsDebuggingEnabled)
    //send email to developer;
else
    //send email to customer;

de Rick Strahl @ Detecting-ASPNET-Debug-mode

0
JerryOL