2010-02-02 14 views

risposta

36

Controllare this. L'idea è di ottenere l'elenco degli attributi dell'assieme utilizzando Assembly.GetCustomAttributes() e cercare DebuggableAttribute e quindi trovare se tale attributo ha la proprietà IsJITTrackingEnabled impostata.

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

Il sarcasmo non è veramente necessario. Più spesso che no, la parte più difficile coinvolta nella ricerca su Internet è sapere cosa chiedere. – doogle

+2

FYI, Il link è ora rotto – scojomodena

+0

Il link è stato aggiornato. – Turch

0

Non distribuire in produzione tramite Visual Studio. Esamina Continuous Integration e creazioni con script (ad esempio con NAnt o forse qualcosa di più leggibile come FAKE).

The F5 Key Is Not a Build Process

Per i detrattori che credono che questo non risponde alla domanda, il PO ha scritto:

... Ho bisogno di garantire che tutti i gruppi che stanno per essere schierato erano costruito utilizzando la configurazione di rilascio.

Per garanzia che, utilizzare un server di build, come TeamCity e, eventualmente, uno strumento di gestione delle release come Octopus Deploy. Blocca i sistemi di produzione in modo che gli sviluppatori debbano passare attraverso il processo di compilazione ufficiale.

+1

Questo non risponde alla domanda in alcun modo. È una buona idea avere un processo di compilazione, questa non è una risposta. – jasonmw

25

Mi è piaciuto che David suggerimento, ma si potrebbe anche andare in questo modo (AssemblyInfo.cs):

#if DEBUG 
[assembly: AssemblyDescription("Your application assembly (DEBUG version)")] 
#else if RELEASE 
[assembly: AssemblyDescription("Your application assembly (RELEASE version)")] 
#endif 

Questo è più umana amichevole, come chiunque può fare clic destro che il montaggio, per selezionare Properties e andare a Details scheda.

+2

+1: questo è in realtà lo scopo dietro questa direttiva di assemblaggio. –

+7

Si consiglia di utilizzare AssemblyConfiguration anziché AssemblyDescription. AssemblyConfiguration è documentato come "Specifica la configurazione di build, ad esempio vendita al dettaglio o debug, per un assembly." –

+0

Funziona, ma non è bello come essere in grado di rilevare le cose nel codice senza avere #IF ovunque. – ps2goat

2

Se è installato Reflector, è anche possibile fare clic sull'assieme e cercare l'attributo debuggable ([assembly: Debugable()]) nel riquadro Disassembler.

7

Se è il vostro assieme, credo che l'utilizzo dell'attributo AssemblyConfiguration rappresenti l'approccio migliore. È documentato come "Specifica la configurazione di build, come retail o debug, per un assembly."

A seconda delle configurazioni di build si potrebbe avere codice come questo:

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

Poi controllare l'attributo di 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; 
} 

(So R. Schreurs commento a Rubens Farias dice la stessa, ma ho trovato queste informazioni da qualche altra parte prima di vedere il commento quindi credo che ciò richieda una voce più importante come una risposta completa invece di un commento)

1

Supponendo solo la configurazione di debug e release, il simbolo DEBUG è definito per impostazione predefinita con la configurazione di debug, quindi il codice riportato di seguito in AssemblyInfo.cs (nella cartella Proprietà).

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

Io uso AssemblyTitle sopra AssemblyDescription come apparirà sul mio Windows 7 immobili di file explorer:

DLL File properties

Per chi come Davide e la risposta di stevieg, qui è uno script LINQPad scritto in C#. Per utilizzare lo script, è necessario scaricare LINQPad 5 e assicurarsi che il programma C# sia selezionato come mostrato nell'immagine seguente.

Sostituire semplicemente DLL_FOLDER_PATH in modo che punti alla cartella contenente le DLL da ispezionare.

// 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 può essere scaricato here.

Problemi correlati