2010-02-02 8 views

Antwort

36

Überprüfen Sie this. Die Idee ist, dass Sie die Liste der Assembly-Attribute mithilfe von Assembly.GetCustomAttributes() abrufen und nach DebuggableAttribute suchen und dann herausfinden, ob für dieses Attribut die Eigenschaft IsJITTrackingEnabled festgelegt ist.

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

Der Sarkasmus wird nicht wirklich benötigt. In den meisten Fällen ist der schwierigste Teil der Suche im Internet zu wissen, was zu fragen ist. – doogle

+2

FYI, der Link ist jetzt unterbrochen – scojomodena

+0

Link wurde aktualisiert. – Turch

0

Nicht über Visual Studio in die Produktion bereitstellen. Schauen Sie in Continuous Integration und skripted Builds (z. B. mit NAnt oder vielleicht etwas besser lesbar wie FAKE).

The F5 Key Is Not a Build Process

Um Verleumder, die glauben, dass dies nicht die Frage beantworten, schrieb der OP:

... Ich garantiere müssen, dass alle Baugruppen, die Einsatz sein werden waren erstellt mit Release-Konfiguration.

Um Garantie, die einen Build-Server wie TeamCity verwenden und möglicherweise ein Release-Management-Tool wie Octopus Deploy. Sperren Sie Ihre Produktionssysteme, sodass Entwickler den offiziellen Build-Prozess durchlaufen müssen.

+1

Dies beantwortet die Frage in keiner Weise. Es ist eine gute Idee, einen Build-Prozess zu haben, dies ist keine Antwort. – jasonmw

25

ich liebte, dass David Vorschlag, aber man könnte auch auf diese Weise (AssemblyInfo.cs) gehen:

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

Dieses menschlichere freundlich ist, wie jeder kann, dass die Baugruppe der rechten Maustaste, wählen Properties und gehen Sie zu Details Tab.

+2

+1: das ist eigentlich der Zweck hinter dieser Montageanweisung. –

+7

Ich würde empfehlen AssemblyConfiguration anstelle von AssemblyDescription zu verwenden. Die AssemblyConfiguration ist dokumentiert als "Gibt die Buildkonfiguration an, z. B. Einzelhandel oder Debug für eine Assembly." –

+0

Das funktioniert, aber es ist nicht so schön, Dinge im Code erkennen zu können, ohne irgendwo #IF zu haben. – ps2goat

2

Wenn Reflector installiert ist, können Sie auch auf die Baugruppe klicken und im Disassembler-Fenster nach dem Attribut debuggable ([assembly: Debuggable()]) suchen.

7

Wenn es Ihre Baugruppe ist, glaube ich, die Verwendung des AssemblyConfiguration Attributs ist der beste Ansatz. Es ist dokumentiert als "Gibt die Build-Konfiguration an, z. B. Einzelhandel oder Debug für eine Assembly."

Je nach Build-Konfigurationen können Sie Code wie dieses:

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

dann das Attribut Montage überprüfen:

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

(Ich weiß, R. Schreurs Kommentar an Rubens Farias sagt das gleiche, aber ich habe diese Informationen woanders gefunden, bevor ich den Kommentar sehe, also glaube ich, dass dies einen wichtigeren Eintrag wie eine vollständige Antwort anstelle eines Kommentars erfordert)

1

Wenn Sie nur die Debug- und Release-Konfiguration verwenden, wird das DEBUG-Symbol standardmäßig mit Debug-Konfiguration definiert, daher der folgende Code in AssemblyInfo.cs (unter Eigenschaftenordner).

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

Ich benutze Assembly über Assembly wie es auf meinem Windows 7 Datei-Explorer Eigenschaften angezeigt wird:

DLL File properties

Für diejenigen, die wie David und StevieG Antwort, hier ist ein LINQPad Skript geschrieben in C#. Um das Skript zu verwenden, müssen Sie LINQPad 5 herunterladen und sicherstellen, dass C# -Programm ausgewählt ist, wie im Screenshot unten gezeigt.

Ersetzen Sie einfach DLL_FOLDER_PATH, um auf den Ordner zu verweisen, der die zu prüfenden DLLs enthält.

// 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 kann here heruntergeladen werden.

Verwandte Themen