Ответ 1

Единственный лучший способ сделать это - проверить сами скомпилированные сборки. Существует очень полезный инструмент под названием "Информация сборки сборщика", найденный здесь от Rotem Bloom. После того, как вы установите это, он ассоциируется с файлами .dll, чтобы открыть их сам. После установки вы можете просто дважды щелкнуть мышью на сборке, чтобы открыть ее, и она даст вам детали сборки, как показано на скриншотах ниже. Там вы можете определить, отлаживает ли он скомпилирован или нет.

alt text http://ruchitsurati.net/myfiles/asm_info.jpg

alt text http://ruchitsurati.net/myfiles/release_assembly.PNG

LinkText: http://www.codeplex.com/AssemblyInformation

Надеюсь, что это поможет.

Ответ 2

IMHO, вышеуказанное приложение действительно вводит в заблуждение; он ищет только IsJITTrackingEnabled, который полностью не зависит от того, компилирован ли код для оптимизации и оптимизации JIT.

Отладочный атрибут присутствует, если вы скомпилируете в режиме Release и выберите DebugOutput для чего-либо другого, кроме "none".

Вам также нужно точно определить, что подразумевается под "Debug" и "Release"...

Вы имеете в виду, что приложение настроено с оптимизацией кода? Вы имеете в виду, что вы можете присоединить к нему отладчик VS/JIT? Вы имеете в виду, что он генерирует DebugOutput? Вы имеете в виду, что он определяет константу DEBUG? Помните, что вы можете условно скомпилировать методы с атрибутом System.Diagnostics.Conditional().

IMHO, когда кто-то спрашивает, является ли сборка "Debug" или "Release", они действительно означают, что код оптимизирован...

Итак, вы хотите сделать это вручную или программно?

Вручную: Вам нужно просмотреть значение битовой маски DebuggableAttribute для метаданных сборки. Вот как это сделать:

  • Откройте сборку в ILDASM
  • Откройте манифест
  • Посмотрите на битмаску DebuggableAttribute. Если DebuggableAttribute отсутствует, это определенно оптимизированная сборка.
  • Если он присутствует, посмотрите на 4-й байт - если это "0", это JIT Optimized - что-то еще, это не:

//Версия метаданных: v4.0.30319....//.custom instance void [Mscorlib] System.Diagnostics.DebuggableAttribute::. Т е р (ValueType [mscorlib] System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00)

Программно: предполагая, что вы хотите знать программно, если код JITOptimized, вот правильная реализация:

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

Я представил эту реализацию в своем блоге по адресу:

Как сообщить, что сборка отладка или выпуск