Как я условно включаю атрибуты в C#? “ОТЛАДКА #if” не работает

Если вы хотите быть в безопасности, используйте это: <form method="post" action="<?php echo htmlspecialchars(

Если вы хотите быть в безопасности, используйте это: [110]

SERVER["PHP_SELF"]);?>">

5
задан Brian Tompsett - 汤莱恩 8 July 2016 в 19:01
поделиться

4 ответа

Я разобрался! Я не упомянул ключевую информацию: это был проект 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

С уважением! -Шон

1
ответ дан 14 December 2019 в 01:15
поделиться

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

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

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

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

8
ответ дан 14 December 2019 в 01:15
поделиться

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

0
ответ дан 14 December 2019 в 01:15
поделиться

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

#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 напечатает «Это PrintText2 \ n» тогда и только тогда (если и только если) #define DEBUG1 был определен в этом файле, независимо от других файлов.

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

0
ответ дан 14 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: