visual studio proyecto para net modo generate este entre diferencia depurar depuracion debug create configuracion compilar compilacion como cambie .net compiler-construction debugging

.net - proyecto - release visual studio 2015



Compilador.NET-DEBUG vs. RELEASE (7)

El método preferido es utilizar realmente el atributo condicional para envolver sus llamadas de depuración, no usar las directivas del compilador. #ifs puede ser complicado y puede llevar a problemas de construcció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 establecer el indicador DEBUG, cualquier llamada a WriteDebug se eliminará como se suponía que estaba sucediendo con Debug.Write ().

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 entendí que cuando RELEASE se usó como opción de compilación, todas esas declaraciones quedaron fuera del compilador, liberando su código de producción de la sobrecarga de las instrucciones de depuración. Recientemente, cuando trabajé con Silverlight 2 Beta 2, noté que Visual Studio en realidad estaba conectado a una versión RELEASE que estaba ejecutando fuera de un sitio web público y que mostraba declaraciones DEBUG que supuse que ni siquiera estaban compiladas. Ahora, mi primera inclinación es suponer que hay algo mal en mi entorno, pero también quiero preguntar a cualquier persona que tenga un conocimiento profundo sobre System.Diagnostics.Debug y la opción de compilación DEBUG en general lo que podría malinterpretar aquí.


En mi experiencia, elegir entre Depurar y Liberar en VB.NET no hace diferencia. Puede agregar acciones personalizadas a ambas configuraciones, pero de manera predeterminada, creo que son las mismas.

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


Examine el método Debug.Write . Está marcado con el

[Conditional("DEBUG")]

atributo.

La ayuda de MSDN para los estados ConditionalAttribute :

Indica a los compiladores que se debe ignorar una llamada o atributo de método a menos que se defina un símbolo de compilación condicional especificado.

No importa si la configuración de compilación tiene una etiqueta de versión o depuración, lo que importa es si el símbolo DEPURAR está definido en él.


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 }


También leí el artículo, y me llevó a creer que cuando DEBUG no estaba definido, que la función ConditionalAttribute declarada en System.Debug causaría que el compilador omitiera este código por completo. Supongo que lo mismo es cierto para TRACE. Es decir, las funciones System.Diagnostics.Debug deben tener AtributoCondicional para DEBUG y para TRACE. Estaba equivocado en esa suposición. La clase Trace separada tiene las mismas funciones, y éstas definen ConditionalAttribute dependiendo de la constante TRACE.

De System.Diagnostics.Debug: _ Subescritura compartida pública (_ message As String _)

De System.Diagnostics.Trace: _ Public Shared Sub WriteLine (_ message As String _)

Parece entonces que mi suposición original era correcta, que las sentencias System.Diagnostics.Debug (o system.Diagnostics.Trace) en realidad no están incluidas en la compilación como si estuvieran incluidas en las regiones #IF DEBUG (o #IF TRACE).

Pero también he aprendido aquí de ustedes y he verificado que la compilación RELEASE no se ocupa en sí misma de esto. Al menos con los proyectos de Silverlight, que todavía son un poco escamosos, debe ingresar a las "Opciones de compilación avanzada ..." 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 quizás cambió en 2.0 / VS2005.


Usar el símbolo del compilador DEPURAR, como dijiste, en realidad omite el código del ensamblaje.

Creo que System.Diagnostics.Debug.Write siempre dará salida a un depurador adjunto, incluso si ha creado en modo Release. Por el artículo de MSDN :

Escribe información sobre la depuración para los oyentes de seguimiento en la colección Listeners.

Si no quiere ningún resultado, deberá ajustar su llamada a Debug. Escribir con la constante DEBUG como dijo Juan:

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


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 (Activo / Liberación / Depuración / Todo) y asegúrese de marcar la "Constante de DEPURACIÓN" si desea la información, o desmarquela si no lo hace.

Aplicar cambios y reconstruir