sentencia - Directrices C#if/then para depuración vs lanzamiento
lenguaje c if else ejemplos (12)
En las propiedades de la Solución, tengo la Configuración configurada para "liberar" para mi único proyecto.
Al comienzo de la rutina principal, tengo este código y se muestra "Modo = Depurar". 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 en función del modo de depuración vs versión.
Dado que el propósito de estas directivas de COMPILER es decirle al compilador que NO incluya código, código de depuración, código beta o tal vez el código que necesiten todos sus usuarios finales, excepto el departamento de publicidad, es decir, #Define AdDept que desea Poder incluirlos o eliminarlos en función de 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 hay que hacer 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 fusionado saldrá vivo !.
También es posible que desee utilizar un declarativo 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 liberarlo.
De todos modos, esa es la forma en que lo hago.
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 modo Release por defecto. Usa algo como esto:
#if DEBUG
// debug stuff goes here
#else
// release stuff goes here
#endif
Si quieres hacer algo solo en modo release:
#if !DEBUG
// release...
#endif
Además, vale la pena señalar que puede usar el atributo [Conditional("DEBUG")]
en los métodos que devuelven el void
para que solo se ejecuten 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:
[Conditional("DEBUG")]
void PrintLog() {
Console.WriteLine("Debug info");
}
void Test() {
PrintLog();
}
Elimine #define DEBUG
en su código. Establezca preprocesadores en la configuración de compilación para esa compilación específica (DEBUG / _DEBUG ya debe estar definido en VS).
La razón por la que se imprime "Mode = Debug" es debido a su #define
y luego se salta el elif
.
Además, la forma correcta de comprobarlo es:
#if DEBUG
Console.WriteLine("Mode=Debug");
#else
Console.WriteLine("Mode=Release");
#endif
No compruebe la LIBERACIÓN
Espacio de nombres
using System.Resources;
using System.Diagnostics;
Método
private static bool IsDebug()
{
object[] customAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(DebuggableAttribute), false);
if ((customAttributes != null) && (customAttributes.Length == 1))
{
DebuggableAttribute attribute = customAttributes[0] as DebuggableAttribute;
return (attribute.IsJITOptimizerDisabled && attribute.IsJITTrackingEnabled);
}
return false;
}
No soy un gran fanático de las cosas de #if, especialmente si lo distribuyes por la base de tu código, ya que te dará problemas en el proceso de las versiones de depuración, pero las versiones de la versión fallan si no tienes cuidado.
Así que esto es lo que he encontrado (inspirado por #ifdef en C # ):
public interface IDebuggingService
{
bool RunningInDebugMode();
}
public class DebuggingService : IDebuggingService
{
private bool debugging;
public bool RunningInDebugMode()
{
//#if DEBUG
//return true;
//#else
//return false;
//#endif
WellAreWe();
return debugging;
}
[Conditional("DEBUG")]
private void WellAreWe()
{
debugging = true;
}
}
Prefiero comprobarlo de esta manera vs buscando #defines:
if (System.Diagnostics.Debugger.IsAttached)
{
//...
}
else
{
//...
}
Con la advertencia de que, por supuesto, puede compilar e implementar algo en el modo de depuración pero no tener el depurador adjunto.
Quita tus define en la parte superior.
#if DEBUG
Console.WriteLine("Mode=Debug");
#else
Console.WriteLine("Mode=Release");
#endif
Si está intentando usar la variable definida para el tipo de compilación, debe eliminar las dos líneas ...
#define DEBUG
#define RELEASE
... esto hará que el #if (DEBUG) sea siempre verdadero.
Además, no hay un símbolo de compilación condicional predeterminado para RELEASE . Si desea definir una, vaya a las propiedades del proyecto, haga clic en la pestaña Generar y luego agregue LIBERAR al cuadro de texto de símbolos de compilación Condicional debajo del encabezado General .
La otra opción sería hacer esto ...
#if DEBUG
Console.WriteLine("Debug");
#else
Console.WriteLine("Release");
#endif
Una sugerencia que puede ahorrarle mucho tiempo, no olvide que incluso si elige debug
en la configuración de compilación (en el menú vs2012 / 13 está en BUILD => ADMINISTRADOR DE CONFIGURACIÓN), eso no es suficiente.
Debe prestar atención a la Configuration
PUBLISH, como tal:
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 ser capaz de llamarlo en un enlace de visualización de WebForm desde una clase de viewutils que ya había incluido).
public static bool isDebugging() {
bool debugging = false;
WellAreWe(ref debugging);
return debugging;
}
[Conditional("DEBUG")]
private static void WellAreWe(ref bool debugging)
{
debugging = true;
}
bool isDebug = false;
Debug.Assert(isDebug = true); // ''='', not ''==''
El método Debug.Assert
tiene el atributo condicional DEBUG
. Si no está definido, la llamada y la asignación isDebug = true
se eliminated :
Si se define el símbolo, se incluye la llamada; de lo contrario, se omite la llamada (incluida la evaluación de los parámetros de la llamada).
Si se define DEBUG
, isDebug
se establece en true
(y se pasa a Debug.Assert
, que no hace nada en ese caso).