Cómo identificar si el DLL es Debug o Release build (en .NET)



0 Answers

En mi humilde opinión, la aplicación anterior es realmente engañosa; solo busca el IsJITTrackingEnabled, que es completamente independiente de si el código se compila o no para optimización y JIT Optimization.

DebuggableAttribute está presente si compila en modo Release y elige DebugOutput en cualquier otra cosa que no sea "none".

También necesita definir exactamente qué se entiende por "Depurar" vs. "Liberar" ...

¿Quiere decir que la aplicación está configurada con optimización de código? ¿Quiere decir que puede adjuntar el depurador VS / JIT a él? ¿Quiere decir que genera DebugOutput? ¿Quiere decir que define la constante DEBUG? Recuerde que puede compilar métodos condicionalmente con el atributo System.Diagnostics.Conditional ().

En mi humilde opinión, cuando alguien pregunta si un montaje es "Depurar" o "Liberar", realmente quieren decir si el código está optimizado ...

Entonces, ¿quieres hacer esto de forma manual o programáticamente?

Manualmente : necesita ver el valor de la máscara de bits DebuggableAttribute para los metadatos del conjunto. He aquí cómo hacerlo:

  1. Abra el ensamblado en ILDASM
  2. Abra el Manifiesto
  3. Mire la máscara de bits DebuggableAttribute. Si el DebuggableAttribute no está presente, definitivamente es un ensamblado optimizado.
  4. Si está presente, mira el 4to byte; si es un '0' está JIT Optimizado, cualquier otra cosa, no es:

// Versión de metadatos: v4.0.30319 .... // .custom instance void [mscorlib] System.Diagnostics.DebuggableAttribute ::. Ctor (valuetype [mscorlib] System.Diagnostics.DebuggableAttribute / DebuggingModes) = (01 00 02 00 00 00 00 00)

Programado : suponiendo que desea saber mediante programación si el código está JITOptimizado, aquí está la implementación correcta:

object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute), 
                                                        false);

// If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
if (attribs.Length > 0)
{
    // Just because the 'DebuggableAttribute' is found doesn't necessarily mean
    // it's a DEBUG build; we have to check the JIT Optimization flag
    // i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
    DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
    if (debuggableAttribute != null)
    {
        HasDebuggableAttribute = true;
        IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
        BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";

        // check for Debug Output "full" or "pdb-only"
        DebugOutput = (debuggableAttribute.DebuggingFlags & 
                        DebuggableAttribute.DebuggingModes.Default) != 
                        DebuggableAttribute.DebuggingModes.None 
                        ? "Full" : "pdb-only";
    }
}
else
{
    IsJITOptimized = true;
    BuildType = "Release";
}

He proporcionado esta implementación en mi blog en:

Cómo saber si una Asamblea está depurada o liberada

Question

Posible duplicado:
¿Cómo saber si una aplicación .NET fue compilada en modo DEBUG o RELEASE?

Estoy seguro de que esto se ha preguntado antes, pero la búsqueda de Google y SO me ha fallado.

¿Cómo puedo identificar si una DLL es una compilación de desarrollo o depuración?




Related