2009-07-11 14 views
5

Mit Bezug auf die "Configuration Manager" im Menü Erstellen,C# - Visual Studio 2008 kann konditional kompiliert werden?

Gibt es eine Möglichkeit, meine C# -Code zu kommentieren, so dass der auskommentierte Code nicht kompiliert wird, während die Lösung im Debug-Modus ist, aber kompilieren würde, wenn ich ändere es in den Freigabemodus?

Warum möchte ich das? Der Grund, dass ich Code haben möchte, der im Release-Modus, aber nicht im Debug kompiliert wird, ist, dass ich Code habe, der von meinem Entwicklungs-PC nicht funktioniert (Code, der E-Mails von meinem Host sendet, etc ...).

Anstatt vor der Veröffentlichung durch meinen Code zurückzugehen und die Zeilen zu entfernen, möchte ich, dass dies automatisch erfolgt.

+0

Der Begriff, den Sie in "bedingte Kompilierung" suchen. – Richard

+2

Von Ihrem Update denke ich, dass bedingte Kompilierung nicht wirklich das ist, was Sie wollen. Es ist das, wonach Sie fragen, aber nicht das, was Sie brauchen. Sie benötigen eine Konfiguration, die für Ihre DEV-Umgebung, eine andere in QA und eine andere in Produktion ausgeführt wird. Ich würde mich wirklich auf eine Konfiguration oder eine objektorientierte Lösung dazu stützen. –

+0

Ahhhhh, "Conditional Compilation" ... konnte mir den Begriff nicht einfallen lassen. – Chaddeus

Antwort

10

Sind Sie auf der Suche nach so etwas?

#if DEBUG 
    Console.WriteLine("Debug Mode"); 
#else 
    Console.WriteLine("Release Mode"); 
#endif 

Wenn Sie nur über Release-Modus sorgen, können Sie verwenden:

#if !DEBUG 
    Console.WriteLine("Release Mode"); 
#endif 
+2

Ich würde sagen, das gleiche Problem gilt für diese Lösung wie für mich. Ich würde es nicht empfehlen. Ich würde vorschlagen, das Problem als Ganzes zu betrachten und zu sehen, ob es eine andere Möglichkeit gibt, das größere Problem zu lösen. Eine Vielzahl von #if-Anweisungen oder Conditional-Attributen, die Ihren Code verunreinigen, ist eine sichere Methode, um für jeden Wartungsprogrammierer (oder sogar Sie selbst in ein paar Monaten!) Eine Menge Verwirrung zu erzeugen! –

+2

Warum vermuten Sie, dass das DEBUG-Symbol falsch verwendet wird? ? Es wird standardmäßig zu jedem Projekt hinzugefügt und das Framework ist dazu da, es zu benutzen, also ist es bestimmt dazu bestimmt, verwendet zu werden. Ich finde es etwas ungewöhnlich, dass Sie nur Code im Release-Modus und nicht im Debug-Modus kompilieren würden (normalerweise ist es umgekehrt), aber das Kompilieren von Code zwischen Release-Modus und Debug-Modus ist eine absichtliche und nützliche Eigenschaft der Umgebung. – BlueMonkMN

+0

Mit einem gelegentlichen bedingten Kompilierungsflag ist nichts falsch. Ich stimme zu, wenn Sie mehr als eine Handvoll sehen, ist es verwirrend, obwohl –

10

Sie das Conditional-Attribut für Methoden verwenden könnten (aber nicht einzelne Zeilen Code) für diesen Zweck

z.B. Das Folgende wird nur in DEBUG-Builds kompiliert.

[Conditional("DEBUG")] 
public void MyMethod() 
{ 
    // Do Stuff 
} 

Das DEBUG-Symbol ist bereits in den Projekteinstellungen angegeben. Sie müssten Ihr eigenes Symbol für eine Release-Build erstellen, sagen wir „RELEASE“, so dass Sie diese tun können:

[Conditional("RELEASE")] 
public void MyMethod() 
{ 
    // Do Stuff 
} 

Allerdings empfehle ich wieder würde verstärkt und Blick auf Ihr Problem erneut von einem höheren Level, da ich diese Lösung nicht wirklich empfehlen würde.

+1

Keine direkte Lösung für das, was ich wollte, aber gut zu wissen. Vielen Dank. – Chaddeus

-3

Ich mag falsch sein, aber ich denke, dass Kommentare vom Compiler ignoriert werden. Wenn ich eine Assembly von mir unter .NET Reflector anschaue, sehe ich keine Kommentare, von denen ich weiß, dass sie existieren.

Die Methode von BlueMonkMN funktioniert, um abhängig vom Kompilierungsmodus einen anderen Code auszuführen.

Wenn Sie möchten, dass je nachdem, welcher Kompilierungsmodus (und andere Variablen) Sie verwenden, ein anderer Code ausgeführt werden soll, überprüfen Sie PostSharp. Es ist ein Compiler nach dem Kompilieren, der Code für Ihre Assembly hinzufügen und entfernen kann.

Beispiel Verwendung: - I Liebe zu detaillierte Debug-und Trace-Informationen für meine Projekte haben. - I hasse mit einer print oder trace.write Anweisung nach jedem Methodenergebnis oder Methodenaufruf, da dieser zusätzliche Debugging-Code die Funktion verdeckt, die die Arbeit erledigt.

Sie können PostSharp so konfigurieren, dass diese zusätzlichen Debuginformationen dynamisch erstellt werden! Ein paar Konfigurations-Tweaks und Sie können jeden Aufruf jeder Funktion UND das Ergebnis (mit variablen Inhalten) von jedem Aufruf gedruckt haben. Dies macht es sehr einfach, dem Programmlogikablauf zu folgen.

+0

Lesen Sie die Frage erneut. Er wollte eine bedingte Kompilation, wusste aber nicht, dass sie existierte. –

4

Ich würde versuchen, Ihr Problem mit einer objektorientierten Technik zu lösen. Mit dependency injection würde ich eine Klasse erstellen, die die erforderlichen Debug-Aktionen ausführt.

Etwas wie:

public class MyClass { 

    public MyClass(IDoOtherStuff stuffToDo) { 
     DoOtherStuff = stuffToDo; 
    } 

    private IDoOtherStuff DoOtherStuff { get; set; } 

    public void Do() { 
     DoOtherStuff.BeforeDo(); 

     // Blah blah blah.. 

     DoOtherStuff.AfterDo(); 
    } 
} 

public interface IDoOtherStuff { 
    void BeforeDo(); 
    void AfterDo(); 
} 

public class DebugOtherStuff : IDoOtherStuff { 
    public void BeforeDo() { 
     Debug.WriteLine("At the beginning of Do"); 
    } 

    public void AfterDo() { 
     Debug.WriteLine("At the end of Do"); 
    } 
} 

public class ReleaseOtherStuff : IDoOtherStuff { 
    public void BeforeDo() { } 
    public void AfterDo() { } 
} 

Jetzt können Sie ein Inversion of control Container wie Windsor, Unity, Ninject oder Spring.NET benutzen, um Ihre Entwicklungsumgebung im Vergleich zu Veröffentlichungs Umgebung zu konfigurieren.

+0

+1 für DI als eine Lösung, obwohl möglicherweise nicht der richtige Weg für dieses Problem, ich glaube, es ist etwas, das Antwort auf die meisten bedingten Kompilierungsfragen ist ... und auch sehr gut erklärt. – Martin