c# - studio - ¿Cómo verificar si un ensamblado fue construido usando la configuración de depuración o liberación?
release vs debug (6)
Me encantó esa sugerencia de David , pero también podrías ir por aquí ( AssemblyInfo.cs
):
#if DEBUG
[assembly: AssemblyDescription("Your application assembly (DEBUG version)")]
#else if RELEASE
[assembly: AssemblyDescription("Your application assembly (RELEASE version)")]
#endif
Esto es más amigable para los humanos, ya que cualquier persona puede hacer clic derecho en ese ensamblaje, seleccionar Properties
e ir a la pestaña Details
.
Estoy comenzando la implementación de mi aplicación web y necesito garantizar que todos los ensamblajes que se implementarán se crearon utilizando la configuración de Release. Nuestro sistema fue desarrollado usando C # /. Net 3.5.
¿Hay alguna forma de lograr esto?
No implementar en producción a través de Visual Studio. Observe la integración continua y las compilaciones con guiones (como NAnt , o tal vez algo más legible como FAKE ).
La clave F5 no es un proceso de compilación
Para los detractores que creen que esto no responde a la pregunta, el OP escribió:
... Necesito garantizar que todos los ensamblajes que se implementarán se construyeron utilizando la configuración de Release.
Para garantizar eso, use un servidor de compilación como TeamCity y posiblemente una herramienta de administración de versiones como Octopus Deploy . Bloquea tus sistemas de producción para que los desarrolladores tengan que pasar por el proceso de compilación oficial.
Si es su ensamblaje, creo que usar el atributo AssemblyConfiguration es el mejor enfoque. Está documentado como "Especifica la configuración de compilación, como minorista o de depuración, para un ensamblaje".
Dependiendo de las configuraciones de tu compilación, podrías tener un código como este:
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
Luego verifique el atributo de ensamblaje:
public static bool IsAssemblyConfiguration(Assembly assembly, string configuration)
{
var attributes = assembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
if (attributes.Length == 1)
{
var assemblyConfiguration = attributes[0] as AssemblyConfigurationAttribute;
if (assemblyConfiguration != null)
{
return assemblyConfiguration.Configuration.Equals(configuration, StringComparison.InvariantCultureIgnoreCase);
}
}
return true;
}
(Sé que el comentario de R. Schreurs en Rubens Farias dice lo mismo, pero he encontrado esta información en otro lugar antes de ver el comentario, así que creo que esto requiere una entrada más importante, como una respuesta completa en lugar de un comentario)
Si tiene instalado Reflector, también puede hacer clic en el conjunto y buscar el atributo de depuración ([assembly: Debuggable ()]) en el panel Desensamblador.
Suponiendo solo la configuración de depuración y liberación, el símbolo DEPURAR se define de manera predeterminada con la configuración de depuración, por lo que el código a continuación en AssemblyInfo.cs (en la carpeta de Propiedades).
#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif
Yo uso AssemblyTitle sobre AssemblyDescription, ya que se mostrará en mis propiedades de explorador de archivos de Windows 7:
Para aquellos que les gusta la respuesta de David y Stevieg, aquí hay un script de LINQPad escrito en C #. Para usar la secuencia de comandos, debe descargar LINQPad 5 y asegurarse de que el programa C # esté seleccionado como se muestra en la captura de pantalla a continuación.
Simplemente reemplace DLL_FOLDER_PATH para que apunte a la carpeta que contiene las DLL que se inspeccionarán.
// TODO - Specify your folder containing DLLs to inspect
static string DLL_FOLDER_PATH = @"C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.0";
void Main()
{
(from dllPath in Directory.GetFiles(DLL_FOLDER_PATH, "*.dll")
let assembly = dllPath.SafeLoad()
let build = assembly == null ? "Error" : (dllPath.SafeLoad().IsAssemblyDebugBuild() ? "Debug" : "Release")
select new {
Assembly_Path = dllPath,
Build = build,
}).Dump();
}
static class Extensions {
public static bool IsAssemblyDebugBuild(this Assembly assembly)
{
return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Select(da => da.IsJITTrackingEnabled).FirstOrDefault();
}
public static Assembly SafeLoad(this string path){
try{
return Assembly.LoadFrom(path);
}
catch {
return null;
}
}
}
LINQPAD 5 se puede descargar aquí .
Mira this La idea es que obtenga la lista de atributos de ensamblaje utilizando Assembly.GetCustomAttributes()
y busque DebuggableAttribute
y luego busque si dicho atributo tiene la propiedad IsJITTrackingEnabled
establecida.
public bool IsAssemblyDebugBuild(Assembly assembly)
{
return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
}