¿Cómo comprobar si una asamblea fue construido mediante la configuración de depuración o lanzamiento?

StackOverflow https://stackoverflow.com/questions/2186613

Pregunta

estoy empezando despliegue de mi aplicación web y necesito garantía de que todos los conjuntos que van a ser desplegados fueron construidos usando la configuración de lanzamiento. Nuestro sistema fue desarrollado usando C # /. Net 3.5.

¿Hay alguna manera de lograr esto?

¿Fue útil?

Solución

este . La idea es que se obtiene la lista de atributos utilizando el montaje Assembly.GetCustomAttributes() y la búsqueda de DebuggableAttribute y luego encontrar si dicho atributo tiene establecida la propiedad IsJITTrackingEnabled.

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }

Otros consejos

Me encantó que David sugerencia, pero también se puede ir de esta manera (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 humana de usar, ya que cualquiera puede hacer clic en esa asamblea, para seleccionar Properties e ir a la pestaña Details.

Si es su ensamblaje Creo con la atributo AssemblyConfiguration es el mejor enfoque. Está documentado como "Especifica la configuración de generación, tales como el comercio minorista o de depuración, para una asamblea."

En función de sus configuraciones de construcción que podría tener un código como este:

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

A continuación, comprobar el atributo de ensamblado:

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é comentario R. Schreurs a Rubens Farías dice lo mismo, pero no tengo encontrar 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 montaje y la mirada para el atributo depurable ([assembly: depurable ()]). En el panel de desensamblador

Suponiendo única configuración de depuración y de lanzamiento, de símbolos de depuración es por defecto definido con configuración de depuración, así que el código de abajo en AssemblyInfo.cs (en la carpeta Propiedades).

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

Yo uso AssemblyTitle sobre AssemblyDescription como se mostrará en mi Windows 7 propiedades de explorador de archivos:

propiedades de archivo DLL

Para los que como David y la respuesta de StevieG, aquí es un script LINQPad escrito en C #. Para utilizar la secuencia de comandos, es necesario descargar LINQPad 5 y asegúrese de C # programa es seleccionado como se muestra en pantalla de abajo.

Simplemente reemplace DLL_FOLDER_PATH a punto a la carpeta que contiene los archivos DLL para ser inspeccionado.

// 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 liberación o versión de depuración utilizando LINQPad5

LINQPad 5 se puede descargar aquí .

No despliegue de la producción a través de Visual Studio. Look en de integración continua y con guión construye (tal como con de NAnt , o quizás algo más legible como falso).

La tecla F5 no es un proceso de construcción

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

  

... I necesidad de garantizar que todos los conjuntos que van a ser   desplegados fueron construidos mediante la configuración de salida.

Garantía que utilizar un servidor de compilación como TeamCity y, posiblemente, una herramienta de gestión de la liberación como pulpo Implementar . Bloquear sus sistemas de producción para que los desarrolladores tienen que pasar por el proceso oficial de construcción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top