2010-08-04 4 views
31

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 suis en train de tester.Le code .NET doit être exécuté uniquement dans la configuration de débogage.

Je voudrais seulement définir ce paramètre dans mon code quand je suis en train de tester. Actuellement, je ne fais que commenter le code lorsque je fais une version release.

Existe-t-il une manière automatique de le faire en fonction de la configuration de construction?

Répondre

73

1: Vous pouvez utiliser Conditional attribut:

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

2 : #ifpreprocessor directive:

#if DEBUG 
    static int testCounter = 0; 
#endif 

3: Ou Debug.Write \ Debug.WriteLine méthode:

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

Méfiez-vous d'utiliser #if directive car il peut produire des situations imprévues dans la construction de sortie. Par exemple, voir:

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

Dans ce cas, la génération non-Debug imprime un message vide.


En savoir plus:


Il y a aussi un outil, DebugView, qui permet de capturer des informations de débogage des applications externes.

+0

Ces méthodes 'Debug.WriteXXX' sont également attribuées à' [Conditional ("DEBUG")] '. – zwcloud

31

oui, enveloppent le code dans

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

Google pour "C# compilation symbols"

Visual Studio définit automatiquement DEBUG lorsque vous êtes dans la configuration de débogage. Vous pouvez définir les symboles que vous voulez (regardez les propriétés de votre projet, l'onglet de construction). Méfiez-vous du fait que l'abus des directives du préprocesseur est une mauvaise idée, cela peut conduire à un code très difficile à lire/maintenir.

+0

Pouvez-vous donner un exemple d'abus? –

+1

J'ai déjà travaillé sur un projet qui avait '#if VERSION_1_1 // fait des choses spécifiques à la version 1.1 #elif VERSION_2_0 #if INCLUDE_FLASH // fait des choses spécifiques au flash #elif HTML_RENDERER // HTML specific stuff #else /// etC# endif' bien sûr étant un commentaire qui ne se met pas en forme correctement, mais vous avez l'idée. C'est ainsi qu'ils ont décidé de maintenir différentes versions. C'était assez pour vous donner envie d'aller postal. –

+0

Ahh. Merci pour le conseil. Je n'essaie pas de faire quelque chose comme ça. Je pense que ramifier avec le contrôle de la source serait probablement mieux dans des situations comme ça. –

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

Outre les 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é lorsque votre application est construite en mode débogage. Comme indiqué dans le commentaire ci-dessous, ils ne fonctionnent que lorsque la méthode a un type de retour vide.

+1

Cela ne fonctionne que sur les méthodes qui renvoient 'void', btw. –

2

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

Une meilleure explication peut être vu à: 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 
    } 
} 
8

J'ai eu ce même problème et la solution que je suis allé avec est utilisé:

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

Cela signifie que sur le plan technique dans la production, vous pouvez joindre un débogueur et d'obtenir ce morceau de code à exécuter.

1

Ce qui suit est sûr à utiliser:

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

if (isDebug) { 
    // Do something 
} 
0

Cela fonctionne en asp.net:

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

de Rick Strahl @Detecting-ASPNET-Debug-mode

Questions connexes