С# если /then директивы для debug vs release

В свойствах решения у меня есть настройка "release" для моего одного и только проекта.

В начале основной процедуры у меня есть этот код, и он показывает "Mode = Debug". У меня также есть эти две строки на самом верху:

#define DEBUG 
#define RELEASE

Я проверяю правильную переменную?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

Моя цель - установить разные значения по умолчанию для переменных на основе режима debug vs release.

Ответ 1

Удалите #define DEBUG в коде. Установите препроцессоры в конфигурации сборки для этой конкретной сборки (DEBUG/_DEBUG должен быть определен в VS уже).

Причина, по которой он печатает "Режим = Отладка", происходит из-за вашего #define, а затем пропускает elif.

Кроме того, правильный способ проверки:

#if DEBUG
    Console.WriteLine("Mode=Debug"); 
#else
    Console.WriteLine("Mode=Release"); 
#endif

Не проверяйте RELEASE

Ответ 2

По умолчанию Visual Studio определяет DEBUG, если проект скомпилирован в режиме отладки и не определяет его, если он находится в режиме деблокирования. RELEASE по умолчанию не определен в режиме деблокирования. Используйте что-то вроде этого:

#if DEBUG
  // debug stuff goes here
#else
  // release stuff goes here
#endif

Если вы хотите что-то сделать только в режиме выпуска:

#if !DEBUG
  // release...
#endif

Кроме того, стоит отметить, что вы можете использовать атрибут [Conditional("DEBUG")] для методов, возвращающих void, чтобы они выполнялись только в том случае, если определен определенный символ. Компилятор удалит все вызовы этих методов, если символ не определен:

[Conditional("DEBUG")]
void PrintLog() {
    Console.WriteLine("Debug info");
}

void Test() {
    PrintLog();
}

Ответ 3

Я предпочитаю проверять его так: vs ищет #defines:

if (System.Diagnostics.Debugger.IsAttached)
{
   //...
}
else
{
   //...
}

С оговоркой, что, конечно, вы могли бы скомпилировать и развернуть что-то в режиме отладки, но при этом не прилагать отладчика.

Ответ 4

Я не большой поклонник материала #if, особенно если вы распространяете его вокруг своей базы кода, так как это даст вам проблемы, когда сборки Debug проходят, но выпуск сборок завершается неудачно, если вы не будете осторожны.

Итак, вот что я придумал (вдохновленный #ifdef в С#):

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}

Ответ 5

bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='

Метод Debug.Assert имеет условный атрибут DEBUG. Если он не определен, вызов и назначение isDebug = true устранены:

Если символ определен, вызов включается; в противном случае вызов (включая оценку параметров вызова) опускается.

Если DEBUG определено, isDebug устанавливается в true (и передается в Debug.Assert, что в этом случае ничего не делает).

Ответ 6

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

#define DEBUG  
#define RELEASE 

... это приведет к тому, что #if (DEBUG) всегда будет истинным.

Также для RELEASE не существует условного символа компиляции по умолчанию. Если вы хотите определить один переход к свойствам проекта, перейдите на вкладку "Сборка", а затем добавьте RELEASE в текстовое поле "Условные компиляции" под заголовком "Общие".

Другой вариант - сделать это...

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Release");
#endif

Ответ 7

Удалите свои определения в верхней части

#if DEBUG
        Console.WriteLine("Mode=Debug"); 
#else
        Console.WriteLine("Mode=Release"); 
#endif

Ответ 8

Немного измененная (бастардованная?) версия ответа Тома Томсона как статическая функция, а не отдельный класс (я хотел иметь возможность называть его в режиме просмотра WebForm из класса viewutils, который я уже включил).

public static bool isDebugging() {
    bool debugging = false;

    WellAreWe(ref debugging);

    return debugging;
}

[Conditional("DEBUG")]
private static void WellAreWe(ref bool debugging)
{
    debugging = true;
}

Ответ 9

NameSpace

using System.Resources;
using System.Diagnostics;

Метод

   private static bool IsDebug()
    {
        object[] customAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(DebuggableAttribute), false);
        if ((customAttributes != null) && (customAttributes.Length == 1))
        {
            DebuggableAttribute attribute = customAttributes[0] as DebuggableAttribute;
            return (attribute.IsJITOptimizerDisabled && attribute.IsJITTrackingEnabled);
        }
        return false;
    }

Ответ 10

Обязательно определите константу DEBUG в свойствах сборки проекта. Это активирует #if DEBUG. Я не вижу заранее определенной константы RELEASE, поэтому это может означать, что все, что не находится в блоке DEBUG, находится в режиме RELEASE.

Define DEBUG constant in Project Build Properties

Ответ 11

Совет, который может сэкономить вам много времени - не забывайте, что даже если вы выберете debug в конфигурации сборки (в меню vs2012/13 это под BUILD = > CONFIGURATION MANAGER) - этого недостаточно.

Вам нужно обратить внимание на PUBLISH Configuration, как таковой:

enter image description here

Ответ 12

Поскольку целью этих директив COMPILER является указание компилятору НЕ включать код, код отладки, бета-код или, возможно, код, который нужен всем вашим конечным пользователям, за исключением тех, которые принадлежат отделу рекламы, то есть #Define AdDept вы хотите иметь возможность включать или удалять их в соответствии с вашими потребностями. Без необходимости менять исходный код, если, например, не AdDept сливается с AdDept. Затем все, что нужно сделать, это включить директиву #AdDept в страницу свойств параметров компилятора существующей версии программы и выполнить компиляцию и wa la! объединенный программный код оживает!.

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

Во всяком случае, так, как я это делаю.

Ответ 13

#if (C# Reference)

Когда компилятор С# встречает директиву #if, а затем, в конце концов, директиву #endif, он компилирует код между директивами, только если определенный символ определен. В отличие от C и C++, вы не можете присвоить числовое значение символу. Оператор #if в С# является логическим и только проверяет, был ли определен символ или нет. Например:

С#

#if DEBUG
    Console.WriteLine("Debug version");
#endif

Вы можете использовать операторы == (равенство) и! = (Неравенство) только для проверки на истинность или ложь. Истина означает, что символ определен. Оператор #if DEBUG имеет то же значение, что и #if (DEBUG == true). Вы можете использовать операторы && (и), || (или) и! (не), чтобы оценить, были ли определены несколько символов. Вы также можете группировать символы и операторы в скобках.

Ответ 14

Я подумал о лучшем способе. До меня дошло, что блоки #if фактически являются комментариями в других конфигурациях (при условии DEBUG или RELEASE; но верно для любого символа)

public class Mytest
    {
        public DateTime DateAndTimeOfTransaction;
    }

    public void ProcessCommand(Mytest Command)
        {
            CheckMyCommandPreconditions(Command);
            // do more stuff with Command...
        }

        [Conditional("DEBUG")]
        private static void CheckMyCommandPreconditions(Mytest Command)
        {
            if (Command.DateAndTimeOfTransaction > DateTime.Now)
                throw new InvalidOperationException("DateTime expected to be in the past");
        }

Ответ 15

Удалите определения и проверьте, находится ли условие в режиме отладки. Вам не нужно проверять, находится ли директива в режиме выпуска.

Что-то вроде этого:

#if DEBUG
     Console.WriteLine("Mode=Debug"); 
#else
    Console.WriteLine("Mode=Release"); 
#endif