2010-07-22 9 views
10

Estoy escribiendo una aplicación en la que tengo código de depuración que no deseo eliminar, pero deseo que se modifique o elimine al compilar para publicación/publicación. Por ejemplo, me gustaría algo como esto en una versión de depuración:Segregando el código de depuración y liberación en C#

... para convertirse esto en una versión de lanzamiento:

MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

Lo ideal es que estaba esperando a hacer algo como esto:

#if DEBUG_BUILD 
    MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
#else 
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
#endif 

yo preferiría no tener que añadir/eliminar una compilación condicional Símboloen las propiedades del proyecto cada vez que cambie el tipo de construcción; debería suceder automáticamente ¿Hay alguna manera de hacer esto en Microsoft Visual C# 2008 Express Edition? Gracias.

Respuesta

13

Uso:

#if DEBUG 
    // Debug work here 
#else 
    // Release work here 
#endif 

Si lo hace, sólo asegúrese de encender el interruptor "Definición de depuración constante" en las páginas de propiedades (Build página de propiedades del proyecto), y funcionará. Esto se establece en true por defecto para nuevos proyectos de C#. DEBUG se definirá para usted (de forma predeterminada) por el compilador de C#.

0

Se puede escribir un método de extensión que contiene el condicionada por lo que no es necesario para mantener la duplicación cada vez

public static class ExceptionExtensions 
{ 
    public static String ToMyString(this Exception ex) 
    { 
#if DEBUG 
     return ex.ToString(); 
#else 
     return ex.Message; 
#endif 
    } 
} 

Esa sería la forma en que iría al respecto

Y entonces su línea de código sería

MessageBox.Show(ex.ToMyString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

y depurar debe ser definido ya

+1

Ow. Esto parece un abuso de métodos de extensión para mí. –

+2

@Robert P, ¿por qué? – CaffGeek

1

Hay una clase que puede utilizar para escribir sus instrucciones de depuración de espacio de nombres: System.Diagnostics Debug.Assert es lo que desea utilizar

http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert.aspx

Busque también en la clase de depuración para la depuración de todo: http://msdn.microsoft.com/en-us/library/6x31ezs1.aspx

+0

¿Qué tiene Debug.Assert con la pregunta? – CaffGeek

+0

para mostrar mensajes no lo es, pero si está poniendo código para depuración, entonces Asserts podría ser más útil y luego mostrar un cuadro de mensaje. Estoy mostrando opciones más avanzadas que puedes usar – greektreat

0

No sé si las ediciones express tienen esto, pero Visual Studio ya lo tiene incorporado en C#.

En la barra de herramientas que seguramente tiene el menú desplegable que te permite (por defecto) elegir entre depurar y liberar la acumulación, la versión de depuración define el símbolo de depuración para que pueda utilizar:

#ifdef DEBUG 
    // debug code 
#endif 
13

También puede utilizar este atributo.

[Conditional("DEBUG")] 

Esto tiene un par de ventajas sobre la directiva de preprocesador.

Todas las llamadas a métodos marcados como condicional se reemplazarán por Nops si el símbolo condicional no está definido, lo que le ahorra tener que modificar todas las llamadas al mismo.

Su código se comprobará en busca de errores, incluso cuando el símbolo no está definido. (A diferencia de cuando se usa #if DEBUG, que ignora el código en #else durante la compilación)

+0

Eso es increíblemente increíble. –

Cuestiones relacionadas