2009-07-11 17 views
5

Refiriéndose al "Gestor de configuración" en el menú Generar,C# - Visual Studio 2008 capaz de compilación condicional?

¿Hay una manera de comentar mi código C# para que el código comentado no compila mientras que la solución está en el modo de depuración, pero sería compilar si cambiaba para liberar el modo?

¿Por qué quiero esto? La razón por la que deseo tener un código que se compilará en modo Release pero no en Debug es que tengo algún código que no funcionará desde mi PC de desarrollo (código que envía correos electrónicos desde mi host, etc.).

En lugar de tener que volver a ejecutar mi código y descomentar las líneas antes de publicar, me gustaría que fuera automático.

+0

El término que está buscando en "compilación condicional". – Richard

+2

De su actualización, creo que la compilación condicional no es realmente lo que quiere. Es lo que estás pidiendo, pero no lo que necesitas. Necesita una configuración que se ejecute para su entorno DEV, otra en QA y otra en Producción. Realmente me inclinaría por una solución orientada a objetos o configuración para esto. –

+0

Ahhhhh, "Compilación condicional" ... no podía pensar en el término. – Chaddeus

Respuesta

10

¿Estás buscando algo como esto?

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

Si sólo se preocupan por el modo de disparo, puede utilizar:

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

Diría que se aplica el mismo problema a esta solución que a la mía. No lo recomendaría. Sugeriría analizar el problema en su totalidad y ver si hay alguna otra forma de resolver el problema mayor. Tener muchas declaraciones #if o atributos condicionales que ensucian tu código es una forma segura de crear mucha confusión para cualquier programador de mantenimiento (¡o incluso para ti mismo dentro de un par de meses!) –

+2

¿Por qué asumes que el símbolo DEBUG está siendo usado incorrectamente? ? Se agrega de manera predeterminada a cada proyecto y el marco está ahí para usarlo, por lo tanto, está destinado a ser utilizado. Me resulta un tanto inusual que solo compile código en modo de lanzamiento y no en modo de depuración (generalmente es al revés), pero compilar código diferente entre modo de lanzamiento y modo de depuración es una característica intencional y útil del entorno. – BlueMonkMN

+0

No hay nada malo con un indicador de compilación condicional ocasional. Acepto que cuando veas más de un puñado es confuso, aunque –

10

se puede utilizar el atributo condicional en los métodos (pero no las líneas individuales de código) para este fin

por ejemplo, Lo siguiente solo se compilará en compilaciones DEBUG.

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

El símbolo DEPURAR ya está especificado en la configuración del proyecto. Habría que crear su propio símbolo para una liberación de construcción, por ejemplo "LIBERACIÓN", de modo que usted puede hacer esto:

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

Sin embargo, me gustaría recomendar un paso atrás y mirando a su problema de nuevo de un mayor nivel ya que realmente no recomendaría esta solución.

+1

No es una solución directa a lo que quería, pero es bueno saberlo. Gracias. – Chaddeus

-3

Puedo estar equivocado, pero creo que los comentarios son ignorados por el compilador. Si miro un ensamblaje mío usando .NET Reflector, no veo ningún comentario que sepa que exista.

El método de BlueMonkMN funcionará para ejecutar código diferente según el modo de compilación.

Si desea que se ejecute un código diferente según el modo de compilación (y otras variables) que esté utilizando, consulte PostSharp. Es un compilador de compilación posterior que puede agregar y eliminar código para su ensamblaje.

Ejemplo de uso: - I amor para tener información detallada de depuración y rastreo para mis proyectos. - I odio teniendo una declaración print o trace.write después de cada método de resultado o llamada de método, ya que este código de depuración adicional oculta la función que hace el trabajo.

¡Puede configurar PostSharp para crear dinámicamente esta información adicional de depuración! Un par de ajustes de configuración y puede tener cada llamada impresa Y el resultado (con contenido variable) de cada llamada. Esto hace que sea muy fácil seguir el flujo lógico del programa.

+0

Vuelve a leer la pregunta. Él quería una compilación condicional, pero no sabía que existía. –

4

Intentaré resolver su problema con una técnica orientada a objetos. Utilizando dependency injection, construiría una clase que realice las acciones de depuración necesarias.

Algo así como:

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

Ahora, se puede utilizar un recipiente Inversion of control como Windsor, Unity, Ninject, o Spring.NET para configurar el entorno de desarrollo frente al medio ambiente de lanzamiento.

+0

+1 para DI como solución, aunque puede que no sea la forma correcta para este problema, creo que es algo que responde a la mayoría de los problemas de compilación condicional ... y también se explica muy bien. – Martin

Cuestiones relacionadas