Как я могу условно включить атрибуты в C #? "#if DEBUG" не работает - PullRequest
5 голосов
/ 11 июня 2009

Надежная старая директива препроцессора в C # прекрасно работает, когда я пишу:

#if DEBUG
...
(Some code)
...
#endif

Однако атрибуты, заключенные в условный блок, продолжают обрабатываться, и я получаю ошибки, указывающие на это. Например, окружение [AssemblyVersion(...)] в условном блоке, похоже, никак не влияет.

Я могу подробно рассказать, почему мы хотим условно игнорировать [AssemblyVersion (..)], но это не имеет значения. Есть идеи?

Ответы [ 5 ]

8 голосов
/ 11 июня 2009

Это работает правильно для меня. В моем файле AssemblyInfo.cs у меня есть следующее:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif

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

Вы должны убедиться, что ваш символ DEBUG определен только в проекте properties , а не где-либо еще в вашем коде как фактическая инструкция #define DEBUG. Если вы определили это непосредственно в коде, оно будет действовать только для этого файла, а не для всего проекта. Определение его в свойствах проекта приведет к тому, что оно будет действовать для всего проекта.

1 голос
/ 12 июня 2009

Я понял это! Была одна ключевая информация, о которой я не упомянул: это проект Workflow (Guid {14822709-B5A1-4724-98CA-57A101D1B079}). Оказывается, есть ошибка с типом проекта рабочего процесса, в частности файл Workflow.Targets, который включен в файл сборки.

Похоже, что препроцессор действует так, как будто константа DEBUG определена. Вы можете воспроизвести проблему, создав проект рабочего процесса и добавив его в файл AssemblyInfo:

#if DEBUG
[assembly: AssemblyFileVersion("1.0.0.0")]
#endif

Тогда попробуйте сборку релиза. Я подал это с MS: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=466440

С наилучшими пожеланиями! -Sean

0 голосов
/ 10 сентября 2011

Для ответа на комментарий @yoyoyoyosef необходимо проверить страницу свойств вашего проекта.

Вы увидите в меню Build под заголовком General, что флажок «Define DEBUG constant» не установлен.

Это значение изменяется в зависимости от выбора (конфигурации) в верхней части меню «Сборка».

0 голосов
/ 11 июня 2009

проще - вы можете пометить свои функции отладки тегом метаданных [Условно]:

#define DEBUG1

...

public static void PrintText1(string txt)   {
    Console.Write("This is PrintText2\n");
}

[Conditional("DEBUG1")]
public static void PrintText2(string txt)   {
    Console.Write("This is PrintText2\n");
}

[STAThread]
static void Main(string[] args)    {
    PrintText1("This is the unconditional method");
    PrintText2("This function will be called only if 'DEBUG1' is defined");
}

попробуй!

Кроме того, я заметил, что #define существует только в контексте файла, который он определил, например, вызов PrintText2 из другого файла, где отладка не определена, не будет выполняться. Это также работает наоборот:

[Conditional("DEBUG1")]
public static void ConditionedPrint(string txt) {
    Console.Write("This is PrintText2\n");
}

public static void UnconditionedPrint(string txt)     {
    ConditionedFunc(txt);
}

UnconditionedFunc выведет «This PrintText2 \ n», если (если и только если) #define DEBUG1 был определен в этом файле независимо от других файлов.

Существует также System.Diagnostics.Debug, хотя я не уверен, что он делает.

0 голосов
/ 11 июня 2009

Вы уверены, что не строите в режиме релиза?

...