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

Posible duplicado:
¿Cómo saber si una aplicación .NET fue comstackda 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 comstackción de desarrollo o depuración?

La única forma de hacerlo es verificar los ensamblados comstackdos. Hay una herramienta muy útil llamada ‘Información de ensamblado .NET’ que Rotem Bloom encuentra aquí . Después de instalar esto, se asocia con archivos .dll para abrirse solo. Después de la instalación, puede hacer doble clic en el Ensamblaje para abrir y le dará los detalles del ensamblaje como se muestra en las capturas de pantalla a continuación. Allí puede identificar si está depurado o no.

Espero que esto ayude..

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 comstack o no para optimización y JIT Optimization.

DebuggableAttribute está presente si comstack 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 comstackr métodos condicionalmente con el atributo System.Diagnostics.Conditional ().

En mi humilde opinión, cuando alguien pregunta si un assembly 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)

Progtwigdo : suponiendo que desea saber mediante progtwigció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 // ie 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