Saltar al contenido

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

Esta es la contestación más válida que te podemos brindar, sin embargo mírala pausadamente y valora si es compatible a tu proyecto.

Solución:

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

El DebuggableAttribute está presente si compila en modo de lanzamiento y elige DebugOutput en cualquier otra cosa que no sea “ninguno”.

También debe definir exactamente qué se entiende por “Depurar” frente a “Liberar”…

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

En mi humilde opinión, cuando alguien pregunta si un ensamblaje es “Depuración” o “Lanzamiento”, realmente quiere decir si el código está optimizado …

Entonces, ¿quieres hacer esto manualmente o mediante programación?

A mano: debe ver el valor de la máscara de bits DebuggableAttribute para los metadatos del ensamblado. Aquí está cómo hacerlo:

  1. Abra el ensamblaje en ILDASM
  2. Abre el Manifiesto
  3. Mire la máscara de bits DebuggableAttribute. Si DebuggableAttribute no está presente, definitivamente es un ensamblado optimizado.
  4. Si está presente, mire el cuarto byte; si es un ‘0’, está optimizado para JIT; cualquier otra cosa, no lo es:

// Versión de metadatos: v4.0.30319 …. // .instancia personalizada void
[mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype
[mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 )

Programáticamente: suponiendo que desea saber mediante programación si el código está JITOptimized, aquí está la implementación correcta (en una aplicación de consola simple):

void Main()

    var HasDebuggableAttribute = false;
    var IsJITOptimized = false;
    var IsJITTrackingEnabled = false;
    var BuildType = "";
    var DebugOutput = "";
    
    var ReflectedAssembly = Assembly.LoadFile(@"path to the dll you are testing");
    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;
            
            // IsJITTrackingEnabled - Gets a value that indicates whether the runtime will track information during code generation for the debugger.
            IsJITTrackingEnabled = debuggableAttribute.IsJITTrackingEnabled;
            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";
    

    Console.WriteLine($"nameof(HasDebuggableAttribute): HasDebuggableAttribute");
    Console.WriteLine($"nameof(IsJITOptimized): IsJITOptimized");
    Console.WriteLine($"nameof(IsJITTrackingEnabled): IsJITTrackingEnabled");
    Console.WriteLine($"nameof(BuildType): BuildType");
    Console.WriteLine($"nameof(DebugOutput): DebugOutput");

He proporcionado esta implementación en mi blog en:

Cómo saber si un ensamblado es de depuración o lanzamiento

La única mejor manera de hacer esto es verificar los ensamblajes compilados. Hay una herramienta muy útil llamada ‘Información de ensamblado .NET’ encontrada aquí por Rotem Bloom. Después de instalar esto, se asocia con archivos .dll para abrirse consigo mismo. Después de la instalación, puede hacer doble clic en el ensamblaje para abrirlo y le dará los detalles del ensamblaje como se muestra en las capturas de pantalla a continuación. Allí puede identificar si está compilado de depuración o no.

Espero que esto ayude..

Te mostramos reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *