Pregunta

Durante años he estado usando la constante del compilador DEBUG en VB.NET para escribir mensajes en la consola.También he estado usando System.Diagnostics.Debug.Write de manera similar.Siempre tuve entendido que cuando se usaba RELEASE como opción de compilación, el compilador omitía todas estas declaraciones, liberando su código de producción de la sobrecarga de las declaraciones de depuración.Recientemente, cuando trabajaba con Silverlight 2 Beta 2, noté que Visual Studio en realidad se adjuntó a una compilación RELEASE que estaba ejecutando desde un sitio web público y mostraba declaraciones DEBUG que supuse que ni siquiera estaban compiladas.Ahora, mi primera inclinación es asumir que hay algún problema con mi entorno, pero también quiero preguntarle a cualquier persona con un conocimiento profundo sobre System.Diagnostics.Debug y la opción de compilación DEBUG en general qué puedo estar malinterpretando aquí.

¿Fue útil?

Solución

El método preferido es utilizar el atributo condicional para ajustar las llamadas de depuración, no utilizar las directivas del compilador.#ifs puede resultar complicado y provocar problemas de compilación extraños.

Un ejemplo de uso de un atributo condicional es el siguiente (en C#, pero también funciona en VB.NET):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

Cuando compila sin el indicador DEBUG establecido, cualquier llamada a WriteDebug se eliminará como se supuso que estaba sucediendo con Debug.Write().

Otros consejos

Examina el Depurar.Escribir método.Está marcado con el

[Conditional("DEBUG")]

atributo.

La ayuda de MSDN para Atributo condicional estados:

Indica a los compiladores que se debe ignorar una llamada o atributo de método a menos que se especifique Se define el símbolo de compilación condicional.

No importa si la configuración de compilación tiene una etiqueta de lanzamiento o depuración, lo que importa es si el símbolo DEBUG está definido en ella.

Lo que hago es encapsular la llamada a Debug en mi propia clase y agregar una directiva de precompilador.

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}

El uso del símbolo del compilador DEBUG, como dijiste, en realidad omitirá el código del ensamblado.

Creo que System.Diagnostics.Debug.Write siempre generará resultados en un depurador adjunto, incluso si lo ha creado en modo de lanzamiento.Según el artículo de MSDN:

Escribe información sobre la depuración en los agentes de escucha de seguimiento de la colección de agentes de escucha.

Si no quieres cualquier salida, necesitarás ajustar tu llamada a Debug.Write con la constante DEBUG como dijo Juan:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif

También leí el artículo y me llevó a creer que cuando no se definió DEBUG, el atributo condicional declarado en las funciones System.Debug haría que el compilador omitiera este código por completo.Supongo que lo mismo ocurre con TRACE.Es decir, las funciones System.Diagnostics.Debug deben tener atributos condicionales para DEBUG y TRACE.Me equivoqué en esa suposición.La clase Trace separada tiene las mismas funciones y estas definen ConditionalAttribute dependiendo de la constante TRACE.

De System.Diagnostics.Debug:_ Public Shared Sub Write (_ Mensaje como cadena _)

De System.Diagnostics.Trace:_ Sub escritura pública compartida (_ Mensaje como cadena _)

Entonces parece que mi suposición original era correcta, que las declaraciones System.Diagnostics.Debug (o system.Diagnostics.Trace) en realidad no se incluyen en la compilación como si estuvieran incluidas en las regiones #IF DEBUG (o #IF TRACE).

Pero también aprendí aquí de ustedes, y verifiqué, que la compilación RELEASE en sí misma no se encarga de esto.Al menos con los proyectos de Silverlight, que todavía son un poco inestables, es necesario acceder a las "Opciones avanzadas de compilación..." y asegurarse de que DEBUG no esté definido.

Saltamos de .NET 1.1/VS2003 a .NET 3.5/VS2008, así que creo que algo de esto solía funcionar de manera diferente, pero tal vez cambió en 2.0/VS2005.

Para seleccionar si desea que la información de depuración se compile o se elimine,

ingrese a la pestaña "Construir" en la ventana de propiedades del proyecto.

Elija la configuración correcta (Active/Release/Depug/All) y asegúrese de verificar la "depuración constante" si desea la información, o desmarque si no lo hace.

Aplicar cambios y reconstruir

En mi experiencia, elegir entre Depurar y Liberar en VB.NET no hace ninguna diferencia.Puedes agregar acciones personalizadas a ambas configuraciones, pero por defecto creo que son iguales.

El uso de Release ciertamente no eliminará las declaraciones System.Diagnostics.Debug.Write.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top