Как определить, было ли приложение .NET скомпилировано в режиме DEBUG или RELEASE?

У меня есть приложение, установленное на моем компьютере. Как узнать, был ли он скомпилирован в режиме DEBUG или нет?

Я попытался использовать .NET Reflector, но он не показывает ничего конкретного. Вот что я вижу:

// 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

Ответ 1

I blogged это давным-давно, и я не знаю, действительно ли он действителен или нет, но код что-то вроде...

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

Ответ 2

ZombieSheep ответ неверный.

Мой ответ на этот дублирующий вопрос здесь: как узнать, было ли приложение .NET скомпилировано в режиме отладки или RELEASE?

Будьте очень осторожны - просто посмотрите на "атрибуты сборки" в манифесте сборки на наличие атрибута "Debuggable", НЕ означает, что у вас есть сборка, которая не оптимизирована JIT. Сборка может быть оптимизирована с помощью JIT, но в настройках вывода сборки в настройках Advanced Build должна быть указана информация "full" или "только для pdb" - в этом случае будет присутствовать атрибут "Debuggable".

Пожалуйста, обратитесь к моим сообщениям ниже для получения дополнительной информации: как определить, является ли сборка отладкой или выпуском, и как определить, является ли библиотека DLL отладкой или выпуском сборки (в .NET)

Приложение Jeff Key не работает должным образом, потому что оно определяет сборку "Debug" на основе наличия DebuggableAttribute. Атрибут DebuggableAttribute присутствует, если вы компилируете в режиме Release и выбираете DebugOutput для чего-либо, кроме "none".

Вы также должны определить точное значение слова "Отладка" и "Выпуск"...

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

Ответ 3

На самом деле вы на правильном пути. Если вы посмотрите в окне Disassembler в отражателе, вы увидите следующую строку, если она была построена в режиме отладки:

[assembly: Debuggable(...)]

Ответ 4

Как насчет использования утилиты Jeff Key IsDebug? Он немного устарел, но поскольку у вас есть Reflector, вы можете декомпилировать его и перекомпилировать в любой версии фреймворка. Я сделал.

Ответ 5

Вот VB.Net версия решения, предложенного 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

Обновить
Это решение работает для меня, но, как отметил Дейв Блэк, может быть ситуация, когда нужен другой подход.
Так что, возможно, вы также можете посмотреть ответ Дейва Блэка: