2010-02-02 11 views

Respuesta

36

Verificar this. La idea es que obtenga la lista de atributos de ensamblaje usando Assembly.GetCustomAttributes() y busque DebuggableAttribute y luego busque si dicho atributo tiene el conjunto de propiedades IsJITTrackingEnabled.

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

El sarcasmo no es realmente necesario. La mayoría de las veces, la parte más difícil de buscar en Internet es saber qué preguntar. – doogle

+2

FYI, El enlace ahora está roto – scojomodena

+0

El enlace ha sido actualizado. – Turch

0

No implementar en producción a través de Visual Studio. Mire en Continuous Integration y compilaciones con guiones (como con NAnt, o tal vez algo más legible como FAKE).

The F5 Key Is Not a Build Process

Para 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 construido utilizando la configuración de lanzamiento.

Para garantía de que, utilice un servidor de compilación como TeamCity y, posiblemente, una herramienta de gestión de la liberación como Octopus Deploy. Bloquea tus sistemas de producción para que los desarrolladores tengan que pasar por el proceso de compilación oficial.

+1

Esto no responde la pregunta de ninguna manera. Es una buena idea tener un proceso de compilación, esta no es una respuesta. – jasonmw

25

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 Details lengüeta.

+2

+1: este es realmente el propósito de esta directiva de conjunto. –

+7

Recomendaría usar AssemblyConfiguration en lugar de AssemblyDescription. AssemblyConfiguration está documentada como "Especifica la configuración de compilación, como minorista o de depuración, para un ensamblaje". –

+0

Esto funciona, pero no es tan bueno como poder detectar cosas en el código sin tener #IF en todas partes. – ps2goat

2

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

7

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 sus configuraciones de construcción que podría tener un código como éste:

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

A continuación, compruebe el atributo de montaje:

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

(Yo sé comentario R. Schreurs a Rubens Farías dice lo mismo, pero encontré 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)

1

Suponiendo solo la configuración de depuración y liberación, el símbolo DEPURAR se define de forma 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 

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

DLL File properties

Para aquellos que al igual que David y la respuesta de StevieG, aquí es un script LINQPad escrito en DO#. 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 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; 
     } 
    } 
} 

Checking release or debug build using LINQPad5

LINQPad 5 se puede descargar here.

Cuestiones relacionadas