Comment identifier si la DLL est Debug ou release build (in.NET) [duplicata]

possibilité de dupliquer:

Comment dire si une application .NET a été compilée en mode DEBUG ou RELEASE?

je suis sûr que cela a été demandé avant, mais google et donc la recherche m'a échoué.

Comment puis-je identifier si une DLL est une construction de release ou de debug?

90
demandé sur Community 2009-04-28 21:13:12

2 réponses

la seule meilleure façon de le faire est de vérifier les assemblages compilés eux-mêmes. Il y a cet outil très utile appelé '.net Assembly Information' trouvé ici par Rotem Bloom. Après avoir installé ceci, il s'associe avec .dll fichiers à ouvrir avec lui-même. Après l'installation, vous pouvez simplement double-cliquer sur l'Assemblée ouverte et il va vous donner les détails d'assemblage, comme indiqué dans les captures d'écran ci-dessous. Là vous pouvez identifier si c'est debug compilé ou non.

Espérons que cette aide..

88
répondu this. __curious_geek 2018-04-25 07:17:09

IMHO, l'application ci-dessus est vraiment trompeuse; elle ne recherche que le Isjittrackenabled qui est complètement indépendant de si le code est compilé ou non pour l'optimisation et L'optimisation JIT.

le DebuggableAttribute est présent si vous compilez en mode Release et choisissez DebugOutput pour autre chose que"none".

vous devez également définir exactement ce que l'on entend par" Debug "vs."Release"...

voulez-vous dire que l'application est configurée avec l'optimisation du code? Voulez-vous dire que vous pouvez y attacher le débogueur VS/JIT? Vous voulez dire Qu'il génère DebugOutput? Vous voulez dire qu'il définit la constante de débogage? Rappelez-vous que vous pouvez compiler des méthodes avec le système.Diagnostic.Attribut conditionnel ().

IMHO, quand quelqu'un demande si un assemblage est "Debug" ou "Release", il veut vraiment dire si le code est optimisé...

Sooo, voulez-vous faire cela manuellement ou programmatiquement?

manuellement : Vous devez voir la valeur du bitmask de DebuggableAttribute pour les métadonnées de l'Assemblée. Voici comment faire:

  1. ouvrir l'assemblée dans ILDASM
  2. ouvrir le Manifeste
  3. regardez le bitmask Débuggableattribute. Si le DebuggableAttribute n'est pas présent, il est certainement un assemblage optimisé.
  4. s'il est présent, regardez le 4ème octet - s'il est un '0' Il est optimisé JIT - autre chose, il n'est pas:

// Métadonnées version: v4.0.30319 .... // .annulation d'une instance douanière [mscorlib]système.Diagnostic.DebuggableAttribute::.ctor(valuetype [mscorlib]système.Diagnostic.DebuggableAttribute / DebuggingModes) = ( 01 00 02 00 00 00 00 00 )

Programmatically : en supposant que vous voulez savoir programmatically si le code est Jitoptimisé, voici l'implémentation correcte:

object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute), 
                                                        false);

// If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
if (attribs.Length > 0)
{
    // Just because the 'DebuggableAttribute' is found doesn't necessarily mean
    // it's a DEBUG build; we have to check the JIT Optimization flag
    // i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
    DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
    if (debuggableAttribute != null)
    {
        HasDebuggableAttribute = true;
        IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
        BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";

        // check for Debug Output "full" or "pdb-only"
        DebugOutput = (debuggableAttribute.DebuggingFlags & 
                        DebuggableAttribute.DebuggingModes.Default) != 
                        DebuggableAttribute.DebuggingModes.None 
                        ? "Full" : "pdb-only";
    }
}
else
{
    IsJITOptimized = true;
    BuildType = "Release";
}

j'ai fourni cette implémentation sur mon blog à:

Comment savoir si une Assemblée est Debug ou Release

74
répondu Dave Black 2016-03-08 20:27:48