En las propiedades de la Solución, tengo la Configuración establecida en "lanzamiento" para mi único proyecto.
Al comienzo de la rutina principal, tengo este código y muestra "Mode = Debug". También tengo estas dos líneas en la parte superior:
#define DEBUG
#define RELEASE
¿Estoy probando la variable correcta?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Mi objetivo es establecer diferentes valores predeterminados para las variables basadas en el modo de depuración vs liberación.
c#
debugging
release
compiler-directives
NealWalters
fuente
fuente
Respuestas:
DEBUG
/_DEBUG
debería estar definido en VS ya.Elimine el
#define DEBUG
en su código. Establezca preprocesadores en la configuración de compilación para esa compilación específica.La razón por la que imprime "Mode = Debug" se debe a tu
#define
y luego omite elelif
.La forma correcta de verificar es:
No lo revises
RELEASE
.fuente
#if
y no#ifdef
?#ifdef
es específico del preprocesador de C / C ++, C # exige el uso de#if
.De forma predeterminada, Visual Studio define DEBUG si el proyecto se compila en modo Debug y no lo define si está en modo Release. RELEASE no está definido en el modo Release por defecto. Usa algo como esto:
Si solo quieres hacer algo en el modo de lanzamiento:
Además, vale la pena señalar que puede usar el
[Conditional("DEBUG")]
atributo en los métodos que vuelvenvoid
a ejecutarse solo si se define un determinado símbolo. El compilador eliminaría todas las llamadas a esos métodos si el símbolo no está definido:fuente
Prefiero comprobarlo así que buscar
#define
directivas:Con la advertencia de que, por supuesto, podría compilar e implementar algo en modo de depuración, pero aún no tiene el depurador conectado.
fuente
#IF DEBUG
en una situación de código de depuración que no debería durar. Para el código de producción, estoy de acuerdo con el uso de lo anterior.#DEBUG
es que esta declaración if está en su código y siempre verifica dónde, ya que la#DEBUG
respuesta elimina el código que no es aplicable en el momento de la compilación, por lo que no tiene una verificación de tiempo de ejecución y su. exe (o lo que sea que compiles) es más pequeño.No soy un gran admirador de las cosas #if, especialmente si lo distribuye por toda la base de su código, ya que le dará problemas donde las compilaciones de Debug pasan pero las compilaciones de Release fallan si no tiene cuidado.
Entonces, esto es lo que se me ocurrió (inspirado en #ifdef en C # ):
fuente
DebuggingService
no es una clase estática y por qué necesita una interfaz. ¿Tiene esto algo que ver con usar esto con un contenedor de IoC?El método
Debug.Assert
tiene atributo condicionalDEBUG
. Si no está definido, la llamada y la asignaciónisDebug = true
se eliminan :Si
DEBUG
se define,isDebug
se establece entrue
(y se pasa aDebug.Assert
, que no hace nada en ese caso).fuente
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Si está intentando utilizar la variable definida para el tipo de compilación, debe eliminar las dos líneas ...
... esto hará que #if (DEBUG) sea siempre verdadero.
Además, no hay un símbolo de compilación condicional predeterminado para RELEASE . Si desea definir uno, vaya a las propiedades del proyecto, haga clic en la pestaña Generar y luego agregue LIBERACIÓN al cuadro de texto Símbolos de compilación condicional bajo el encabezado General .
La otra opción sería hacer esto ...
fuente
Elimina tus definiciones en la parte superior
fuente
Versión ligeramente modificada (¿bastarda?) De la respuesta de Tod Thomson como una función estática en lugar de una clase separada (quería poder llamarla en un enlace de vista WebForm desde una clase viewutils que ya había incluido).
fuente
Asegúrese de definir la constante DEPURACIÓN en las Propiedades de compilación del proyecto. Esto habilitará el
#if DEBUG
. No veo una constante LIBERACIÓN predefinida, por lo que eso podría implicar que cualquier cosa que no esté en un bloque DEPURACIÓN es el modo LIBERACIÓN.fuente
NameSpace
Método
fuente
Un consejo que puede ahorrarle mucho tiempo; no lo olvide, incluso si elige
debug
en la configuración de compilación (en el menú vs2012 / 13 está en BUILD => CONFIGURATION MANAGER), eso no es suficiente.Debe prestar atención a PUBLISH
Configuration
, como tal:fuente
Dado que el propósito de estas directivas del COMPILADOR es decirle al compilador que NO incluya código, código de depuración, código beta o tal vez el código que necesitan todos sus usuarios finales, excepto los del departamento de publicidad, es decir, #Definir AdDept que desea podrá incluirlos o eliminarlos según sus necesidades. Sin tener que cambiar su código fuente si, por ejemplo, un AdDept no se fusiona con el AdDept. Entonces, todo lo que debe hacerse es incluir la directiva #AdDept en la página de propiedades de opciones del compilador de una versión existente del programa y hacer una compilación y ¡wa la! ¡El código del programa combinado sale vivo!
También es posible que desee utilizar una declaración para un nuevo proceso que no esté listo para el horario de máxima audiencia o que no pueda estar activo en el código hasta que sea el momento de lanzarlo.
De todos modos, así es como lo hago.
fuente
Me puse a pensar en una mejor manera. Me di cuenta de que los bloques #if son comentarios efectivos en otras configuraciones (suponiendo
DEBUG
oRELEASE
; pero cierto con cualquier símbolo)fuente
Elimine las definiciones y compruebe si el condicional está en modo de depuración. No necesita verificar si la directiva está en modo de liberación.
Algo como esto:
fuente