¿Cómo comprobar si un ensamblado fue construido usando la configuración de depuración o liberación?


Estoy comenzando el despliegue de mi aplicación web y necesito garantizar que todos los ensamblados que se van a implementar se construyeron utilizando la configuración de la versión. Nuestro sistema fue desarrollado usando C#/. Net 3.5.

¿hay alguna manera de lograr esto?

Author: ps2goat, 2010-02-02

6 answers

Compruebe esto . La idea es que obtenga la lista de atributos de ensamblado usando Assembly.GetCustomAttributes() y busque DebuggableAttribute y luego encuentre si dicho atributo tiene la propiedad IsJITTrackingEnabled establecida.

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }
 37
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-03 17:30:36

Me encantó esa sugerencia de David , pero también podrías ir por este camino (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 cualquiera puede hacer clic derecho en ese ensamblaje, para seleccionar Properties e ir a la pestaña Details.

 26
Author: Rubens Farias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:52

Si es su ensamblado, creo que usar el atributo AssemblyConfiguration es el mejor enfoque. Se documenta como " Especifica la configuración de compilación, como retail o debug, para un ensamblaje."

Dependiendo de sus configuraciones de compilación, puede tener código como este:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif

Luego verifique el atributo assembly:

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)

 7
Author: Guillermo Ruffino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-07 10:48:57

Si tiene instalado Reflector, también puede hacer clic en el ensamblado y buscar el atributo debuggable ([assembly: Debuggable()]) en el panel Desensamblador.

 2
Author: xr280xr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-29 15:14:01

Asumiendo solo la configuración de Depuración y Liberación, el símbolo de DEPURACIÓN está definido por defecto con la configuración de depuración, por lo que el código a continuación en AssemblyInfo.cs (en la carpeta Propiedades).

#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif

Utilizo AssemblyTitle sobre AssemblyDescription ya que aparecerá en mis propiedades del explorador de archivos de Windows 7:

Propiedades del archivo DLL

Para aquellos que les gusta la respuesta de David y stevieg, aquí hay un script de LINQPad escrito en C#. Para usar el script, debe descargar LINQPad 5 y hacer seguro que el programa C# está seleccionado como se muestra en la captura de pantalla a continuación.

Simplemente reemplace DLL_FOLDER_PATH para apuntar a la carpeta que contiene las DLL a inspeccionar.

// 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;
        }
    }
}

Comprobación de release o compilación de depuración usando LINQPad5

LINQPAD 5 se puede descargar aquí .

 1
Author: Chris Voon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 03:20:36

No despliegues en producción a través de Visual Studio. Mira Integración continuay compilaciones con scripts (como con NAnt, o quizás algo más legible como FAKE).

La Clave F5 No Es un Proceso de Compilación

A los detractores que creen que esto no responde a la pregunta, la OP escribió:

...Tengo que garantizar que todas las asambleas que van a ser implementados fueron construidos usando Release configuración.

Para garantizar que, utilice un servidor de compilación como TeamCity y posiblemente una herramienta de administración de versiones como Octopus Deploy. Bloquee sus sistemas de producción para que los desarrolladores deban pasar por el proceso de compilación oficial.

 0
Author: TrueWill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-07 23:42:45