not - c# preprocessor directives




C#если/then директивы для debug vs release (8)

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

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

#define DEBUG 
#define RELEASE

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

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

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


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

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

#define DEBUG  
#define RELEASE 

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

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

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

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

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


По умолчанию 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();
}

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

Вы должны обратить внимание на Configuration PUBLISH:


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

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

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

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

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


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

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

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

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

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

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





release