it-swarm.com.de

.NET-Code muss nur in der Debug-Konfiguration ausgeführt werden

Ich habe etwas Code, der auf eine API im Web zugreift. Mit einem der Parameter der API kann ich ihnen mitteilen, dass ich gerade teste.

Ich möchte diesen Parameter nur beim Testen in meinem Code einstellen. Derzeit kommentiere ich den Code nur aus, wenn ich einen Release-Build mache. 

Gibt es eine automatische Methode, die auf der Build-Konfiguration basiert?

31
Ronnie Overby

Lösungen

Sie können eine der folgenden verwenden:

1: Conditional-Attribut

Das Attribut Conditional gibt Compilern an, dass ein Methodenaufruf oder -attribut ignoriert werden soll, es sei denn, ein angegebenes bedingtes Kompilierungssymbol ist definiert.

Code-Beispiel:

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

2: #if Präprozessoranweisung

Wenn der C # -Compiler auf #ifPräprozessor-Direktive trifft, gefolgt von einer #endif-Direktive, kompiliert er den Code nur dann zwischen den Direktiven, wenn das angegebene Symbol definiert ist. Im Gegensatz zu C und C++ können Sie einem Symbol keinen numerischen Wert zuweisen. Die # if-Anweisung in C # ist boolean und testet nur, ob das Symbol definiert wurde oder nicht.

Code-Beispiel:

#if DEBUG
    static int testCounter = 0;
#endif 

3: Debug.Write Methoden

Debug.Write (und Debug.WriteLine ) schreibt Informationen zum Debug in die Trace-Listener in der Sammlung Listeners .

Siehe auch Debug.WriteIf und Debug.WriteLineIf .

Code-Beispiel:

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

Anmerkungen

Verwenden Sie die #if-Direktive nicht, da dies beim Release-Build zu unbeabsichtigten Situationen führen kann. Zum Beispiel siehe:

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

In diesem Fall wird beim Build ohne Debug eine leere Nachricht gedruckt. Dies kann jedoch NullReferenceException in einem anderen Fall potenziell erhöhen.

Weiterlesen

Siehe auch

Es gibt auch ein Werkzeug, DebugView , mit dem Debug-Informationen von externen Anwendungen erfasst werden können.

80

ja, den Code einpacken 

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

Google für "C # -Kompilierungssymbole"

Visual Studio definiert automatisch DEBUG, wenn Sie sich in der Debug-Konfiguration befinden. Sie können beliebige Symbole definieren (sehen Sie sich die Eigenschaften Ihres Projekts an, den Build-Tab). Beachten Sie, dass der Missbrauch von Präprozessoranweisungen eine schlechte Idee ist, da dies zu Code führen kann, der sehr schwer zu lesen/zu verwalten ist.

31
Matt Greer

Ich hatte das gleiche Problem und die Lösung, mit der ich gegangen bin, ist:

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

Das bedeutet, dass Sie technisch in der Produktion einen Debugger anhängen können und diesen Code ausführen können.

12
James Hulse

Neben den Anweisungen #if #endif können Sie auch bedingte Attribute verwenden. Wenn Sie eine Methode mit dem Attribut markieren

[Conditional("Debug")]

Es wird nur kompiliert und ausgeführt, wenn Ihre Anwendung im Debug-Modus erstellt wird. Wie im folgenden Kommentar erwähnt, funktionieren diese nur, wenn die Methode einen ungültigen Rückgabetyp hat.

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

Hier ist ein anderer Beitrag mit einem ähnlichen Ergebnis: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/

Eine bessere Erklärung finden Sie unter: http://msdn.Microsoft.com/de-de/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

Folgendes ist sicher zu verwenden:

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

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

Das funktioniert in asp.net:

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

von Rick Strahl @ Detective-ASPNET-Debug-Modus

0
JerryOL