2008-10-11 5 views
42

J'ai une application installée sur mon ordinateur. Comment savoir si elle a été compilée en mode DEBUG ou non?Comment savoir si une application .NET a été compilée en mode DEBUG ou RELEASE?

J'ai essayé d'utiliser .NET Reflector, mais cela ne montre rien de spécifique. Voici ce que je vois:

// Assembly APPLICATION_NAME, Version 8.0.0.15072 
Location: C:\APPLICATION_FOLDER\APPLICATION_NAME.exe 
Name: APPLICATION_NAME, Version=8.0.0.15072, Culture=neutral, PublicKeyToken=null 
Type: Windows Application 
+0

questions Stackoverflow des similaires, une question, et beaucoup, beaucoup de réponses différentes: http: // stackoverflow.com/questions/654450/programatically-détection-libération-debug-mode-net http://stackoverflow.com/questions/798971/how-to-idenfiy-if-the-dll-is-debug-or-release -build-in-net http://stackoverflow.com/questions/194616/how-to-tell-if-net-app-was-compiled-in-debug-or-release-mode http://stackoverflow.com/questions/50900/best-way-to-detect-a-release-build-from-a-debug-build-net http://stackoverflow.com/questions/890459/asp-net- release-build-vs-debug-build – Kiquenet

Répondre

29

Je blogged ce depuis longtemps, et je ne sais pas si elle encore valide ou non, mais le code est quelque chose comme ...

private void testfile(string file) 
{ 
    if(isAssemblyDebugBuild(file)) 
    { 
     MessageBox.Show(String.Format("{0} seems to be a debug build",file)); 
    } 
    else 
    { 
     MessageBox.Show(String.Format("{0} seems to be a release build",file)); 
    } 
}  

private bool isAssemblyDebugBuild(string filename) 
{ 
    return isAssemblyDebugBuild(System.Reflection.Assembly.LoadFile(filename));  
}  

private bool isAssemblyDebugBuild(System.Reflection.Assembly assemb) 
{ 
    bool retVal = false; 
    foreach(object att in assemb.GetCustomAttributes(false)) 
    { 
     if(att.GetType() == System.Type.GetType("System.Diagnostics.DebuggableAttribute")) 
     { 
      retVal = ((System.Diagnostics.DebuggableAttribute)att).IsJITTrackingEnabled; 
     } 
    } 
    return retVal; 
} 
+0

Cela semble fonctionner; bien que cela semble plutôt fragile. –

+0

Comme je l'ai dit, il y a quelques années, j'ai fait l'enquête ... Qui sait ce qui a changé dans le cadre, ou même quel est le piètre travail que j'ai fait à l'origine? ;) – ZombieSheep

+0

Merveilleux code! J'ai créé une application de console intégrée dans ma machine de construction pour valider que l'application finale à livrer ne sera pas en mode débogage. – Samuel

9

Vous êtes sur le bon chemin en fait. Si vous regardez dans la fenêtre désassembleur dans le réflecteur, vous verrez la ligne suivante si elle a été construite en mode débogage:

[assembly: Debuggable(...)] 
+7

Pas vrai; Je viens de vérifier un assemblage que j'ai construit en mode Release. Il avait encore cet attribut: [assembly: débogable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] Je –

+3

compilé en mode de libération et je l'ai vu ce réflecteur: [montage: débogable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] – chikak

+5

Quand je démonte un assemblage en mode débogage, je vois ceci: [ montage: débogable (DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)] Quand je construis en mode Release, l'attribut debuggable ne possède que le drapeau IgnoreSymbolStoreSequencePoints, comme vous l'avez tous mentionné. – Alric

2

Que diriez-vous en utilisant l'utilitaire de Jeff Key IsDebug? C'est un peu daté, mais puisque vous avez Reflector vous pouvez le décompiler et le recompiler dans n'importe quelle version du framework. J'ai fait.

+1

+1, mais il n'y a pas besoin de décompiler l'utilitaire - l'auteur fournit le code source: http://www.sliver.com/Downloads/IsDebugSource.zip –

23

La réponse de ZombieSheep est incorrecte.

Ma réponse à cette double question est ici: How to tell if a .NET application was compiled in DEBUG or RELEASE mode?

Soyez très prudent - regarder juste au « assemblage des attributs » dans la Manifest Assemblée pour la présence de l'attribut « débogable » ne pas signifie que vous avoir un assemblage qui n'est pas optimisé par JIT. L'assemblage peut être optimisé par JIT, mais la sortie de l'assemblage dans les paramètres de construction avancée doit inclure les informations 'full' ou 'pdb-only' - auquel cas l'attribut 'Debuggable' sera présent.

S'il vous plaît se référer à mes messages ci-dessous pour plus d'informations: How to Tell if an Assembly is Debug or Release et How to identify if the DLL is Debug or Release build (in .NET)

Jeff demande de clé ne fonctionne pas correctement, car il identifie une compilation « Debug » basé sur si le DebuggableAttribute est présent. Le DebuggableAttribute est présent si vous compilez en mode Release et choisissez DebugOutput à autre chose que "none".

Vous devez également définir exaclty ce que l'on entend par « Debug » par rapport à « Release » ...

  • Voulez-vous dire que l'application est configurée avec l'optimisation de code?
  • Voulez-vous dire que vous pouvez y attacher le débogueur Visual Studio/JIT?
  • Voulez-vous dire qu'il génère DebugOutput?
  • Voulez-vous dire qu'il définit la constante DEBUG? N'oubliez pas que vous pouvez conditionnellement compiler des méthodes avec l'attribut System.Diagnostics.Conditional().
+0

Merci d'avoir fourni une explication détaillée des différents aspects et types de "builds debug". Je serai sûr de diriger les gens vers votre blog la prochaine fois que je verrai des implémentations incertaines. – ulty4life

2

Voici la version VB.Net de la solution proposée par ZombieSheep

Public Shared Function IsDebug(Assem As [Assembly]) As Boolean 
    For Each attrib In Assem.GetCustomAttributes(False) 
     If TypeOf attrib Is System.Diagnostics.DebuggableAttribute Then 
      Return DirectCast(attrib, System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled 
     End If 
    Next 

    Return False 
End Function 

Public Shared Function IsThisAssemblyDebug() As Boolean 
    Return IsDebug([Assembly].GetCallingAssembly) 
End Function 
Questions connexes