Как определить, скомпилировано ли приложение .NET в режиме DEBUG или RELEASE? - PullRequest
43 голосов
/ 12 октября 2008

На моем компьютере установлено приложение. Как узнать, скомпилирован ли он в режиме отладки или нет?

Я пытался использовать .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

Ответы [ 5 ]

29 голосов
/ 12 октября 2008

Я писал в блоге это давно, и я не знаю, действительно ли это все еще действует, но код - что-то вроде ...

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;
}
25 голосов
/ 15 марта 2011

ZombieSheep ответ неправильный.

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

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

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

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

Вам также нужно определить exaclty , что означает «Отладка» против «Выпуск» ...

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

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

[assembly: Debuggable(...)]
2 голосов
/ 04 января 2013

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

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

2 голосов
/ 12 марта 2009

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

...