Как определить, было ли приложение .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

person Community    schedule 11.10.2008    source источник
comment
похожие вопросы в Stackoverflow, один вопрос и много-много разных ответов: сеть режима отладки">stackoverflow.com/questions/654450/ stackoverflow.com/questions/798971/ stackoverflow.com/questions/194616/ stackoverflow.com/questions/50900/ stackoverflow.com/questions/890459/   -  person Kiquenet    schedule 03.02.2011


Ответы (5)


Я записал это в блог давным-давно и не знаю, действительно ли это до сих пор. , но код примерно такой...

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;
}
person ZombieSheep    schedule 11.10.2008
comment
Как я уже сказал, это было пару лет назад, когда я занимался расследованием... Кто знает, что изменилось во фреймворке или даже насколько плохо я выполнял свою работу изначально. ;) - person ZombieSheep; 12.10.2008
comment
Замечательный код! Я создал консольное приложение, интегрированное в мою сборочную машину, чтобы убедиться, что конечное приложение для доставки не будет находиться в режиме отладки. - person Samuel; 25.05.2012
comment
Пожалуйста, смотрите мой ответ ниже о том, почему этот метод проверки сборки DEBUG не является лучшим решением. - person Dave Black; 16.08.2013
comment
К сведению: я только что использовал Visual Studio 2013, созданный для отладки и выпуска одной и той же библиотеки dll, и запускал описанные выше методы (с использованием LINQPad), и оба раза сценарий считал, что рассматриваемая DLL является выпускной сборкой. - person raddevus; 19.09.2017

Ответ ZombieSheep неверен.

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

Будьте очень осторожны — просто просмотр атрибутов сборки в манифесте сборки на наличие атрибута «Отладка» НЕ означает, что у вас есть сборка, не оптимизированная JIT. Сборка может быть JIT-оптимизирована, но в параметрах Advanced Build для параметра «Вывод сборки» должно быть указано «полная» информация или информация «только для pdb» — в этом случае атрибут «Отладка» будет присутствовать.

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

Приложение Джеффа Ки работает неправильно, поскольку оно идентифицирует сборку «Отладка» на основе наличия атрибута DebuggableAttribute. DebuggableAttribute присутствует, если вы компилируете в режиме Release и выбираете для DebugOutput любое значение, кроме «none».

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

  • Вы имеете в виду, что приложение настроено с оптимизацией кода?
  • Вы имеете в виду, что к нему можно подключить отладчик Visual Studio/JIT?
  • Вы имеете в виду, что он генерирует DebugOutput?
  • Вы имеете в виду, что он определяет константу DEBUG? Помните, что вы можете условно компилировать методы с атрибутом System.Diagnostics.Conditional().
person Dave Black    schedule 15.03.2011
comment
Спасибо за подробное объяснение различных аспектов и типов отладочных сборок. Я обязательно укажу людям на ваш блог в следующий раз, когда увижу некоторые сомнительные реализации. - person ulty4life; 25.10.2013

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

[assembly: Debuggable(...)]
person Joe Basirico    schedule 11.10.2008
comment
Не правда; я только что проверил сборку, которую я построил в режиме выпуска. У него все еще был этот атрибут: [сборка: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] - person Robert Taylor; 12.10.2008
comment
Я скомпилировал в режиме выпуска и увидел это в рефлекторе: [сборка: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] - person chikak; 04.12.2009
comment
Когда я разбираю сборку в режиме отладки, я вижу это: [сборка: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)] Когда я создаю ее в режиме выпуска , атрибут debuggable имеет только флаг IgnoreSymbolStoreSequencePoints, как вы все упоминаете. - person Alric; 07.08.2010
comment
Ваш ответ неверен - DebuggableAttribute присутствует, если вы компилируете в режиме Release и выбираете DebugOutput для чего-либо, кроме нуля. - person Dave Black; 02.11.2015

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

person flipdoubt    schedule 12.03.2009
comment
+1, но утилиту декомпилировать не нужно - автор предоставляет исходный код: sliver.com /Загрузки/IsDebugSource.zip - person Luke Girvin; 21.12.2009
comment
Ссылка в ответе устарела - Этот сайт продается! - person Pang; 08.07.2020

Вот версия 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

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

person Max    schedule 04.01.2013
comment
Этот ответ неверен. См. мое подробное объяснение, почему это неверно здесь: stackoverflow.com/questions/798971/ - person Dave Black; 25.02.2019