Cómo identificar si el DLL es Debug o Release build(en.NET)
debugging (2)
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?
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:
- Abra el ensamblado en ILDASM
- Abra el Manifiesto
- Mire la máscara de bits DebuggableAttribute. Si el DebuggableAttribute no está presente, definitivamente es un ensamblado optimizado.
- 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:
La única forma de hacerlo es verificar los ensamblados compilados. Hay una herramienta muy útil llamada ''Información de ensamblado .NET'' que Rotem Bloom encuentra here . 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..