2009-07-11 9 views
5

Riferendosi alla "Configuration Manager" sotto il menu Genera,C# - Visual Studio 2008 in grado di compilare condizionalmente?

C'è un modo di commentare il mio codice C# in modo che il codice commentato non viene compilato mentre la soluzione è in modalità di debug, ma sarebbe compilare se ho cambiato alla modalità di rilascio?

Perché lo voglio? Il motivo per cui voglio avere il codice che verrà compilato in modalità Release ma non in Debug è che ho un codice che non funziona dal mio PC di sviluppo (codice che invia email dal mio host, ecc ...).

Invece di dover eseguire di nuovo il mio codice e le righe di commento prima della pubblicazione, mi piacerebbe che fosse automatico.

+0

Il termine che stai cercando in "compilazione condizionale". – Richard

+2

Dal tuo aggiornamento, penso che la compilazione condizionale non sia proprio ciò che desideri. È quello che stai chiedendo, ma non quello di cui hai bisogno. Hai bisogno di una configurazione che funzioni per il tuo ambiente DEV, un altro in QA e un altro in produzione. Mi piacerebbe davvero orientarmi verso una configurazione o una soluzione orientata agli oggetti per questo. –

+0

Ahhhhh, "Compilazione condizionale" ... non riusciva a pensare al termine. – Chaddeus

risposta

10

Stai cercando qualcosa di simile?

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

Se vi interessa soltanto modalità di rilascio, è possibile utilizzare:

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

Direi che lo stesso problema si applica a questa soluzione come al mio. Non lo raccomanderei. Suggerirei di considerare il problema nel suo complesso e vedere se c'è un altro modo per risolvere il problema più grande. Avere molte affermazioni #if o attributi condizionali che sporcano il tuo codice è un modo sicuro per creare confusione per qualsiasi programmatore di manutenzione (o anche te stesso in un paio di mesi!) –

+2

Perché presumi che il simbolo DEBUG venga utilizzato in modo errato ? Viene aggiunto per impostazione predefinita a ogni progetto e il framework è lì per usarlo, quindi sicuramente è destinato ad essere utilizzato. Trovo un po 'strano che si compili un codice solo in modalità di rilascio e non in modalità di debug (di solito è il contrario), ma la compilazione di codice diverso tra la modalità di rilascio e la modalità di debug è una funzione intenzionale e utile dell'ambiente. – BlueMonkMN

+0

Niente di sbagliato con un flag di compilazione condizionale occasionale. Sono d'accordo quando vedi più di una manciata è confusa, anche se –

10

è possibile utilizzare l'attributo Conditional sui metodi (ma non le singole linee di codice) per questo scopo

esempio Quanto segue verrà compilato solo nei build DEBUG.

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

Il simbolo DEBUG è già specificato nelle impostazioni del progetto. Avresti per creare il proprio simbolo per una build di rilascio, diciamo "RELEASE", in modo che si può fare questo:

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

Tuttavia, vi consiglio di fare un passo indietro e guardare il problema ripartire da un più alto livello come non vorrei davvero raccomandare questa soluzione.

+1

Non una soluzione diretta a quello che volevo, ma buono a sapersi. Grazie. – Chaddeus

-3

Potrei sbagliarmi, ma penso che i commenti siano ignorati dal compilatore. Se guardo un mio assemblaggio usando .NET Reflector, non vedo alcun commento che io conosca.

Il metodo di BlueMonkMN funzionerà per eseguire codice diverso in base alla modalità di compilazione.

Se si desidera avere un codice diverso in esecuzione a seconda della modalità di compilazione (e di altre variabili) che si sta utilizzando, vedere PostSharp. È un compilatore di post-compilazione che può aggiungere e rimuovere il codice per l'assembly.

Esempio di utilizzo: - I amore per disporre di informazioni dettagliate di debug e traccia per i miei progetti. - I odio con una dichiarazione print o trace.write dopo ogni risultato del metodo o chiamata di metodo, poiché questo codice di debugging extra oscura la funzione che esegue il lavoro.

È possibile configurare PostSharp per creare dinamicamente queste informazioni extra di debug! Un paio di modifiche alla configurazione e puoi avere ogni chiamata su ogni funzione stampata E il risultato (con contenuti variabili) da ogni chiamata. Questo rende molto facile seguire il flusso della logica del programma.

+0

Rileggi la domanda. Voleva la compilazione condizionale ma non sapeva che esistesse. –

4

Vorrei provare a risolvere il problema con una tecnica orientata agli oggetti. Utilizzando dependency injection, vorrei costruire una classe che esegue le azioni di debug necessarie.

Qualcosa di simile:

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() { } 
} 

Ora, è possibile utilizzare un contenitore Inversion of control come Windsor, Unity, Ninject, o Spring.NET per configurare l'ambiente di sviluppo contro l'ambiente di rilascio.

+0

+1 per DI come soluzione, anche se potrebbe non essere la strada giusta per questo problema, credo che sia qualcosa che risponda alla maggior parte dei problemi di compilazione condizionale ... e anche spiegato molto bene. – Martin