В течение многих лет я использовал константу компилятора DEBUG в VB.NET для записи сообщений на консоль. Я также использовал System.Diagnostics.Debug.Write аналогичным образом. Я всегда понимал, что, когда RELEASE использовался в качестве опции сборки, все эти операторы были исключены компилятором, освобождая производственный код от накладных расходов на операторы отладки. Недавно, работая с Silverlight 2 Beta 2, я заметил, что Visual Studio фактически прикреплена к сборке RELEASE, которую я запускал с общедоступного веб-сайта, и отображала операторы DEBUG, которые, как я предполагал, даже не были скомпилированы! Теперь я в первую очередь склоняюсь к предположению, что с моей средой что-то не так, но я также хочу спросить любого, кто обладает глубокими знаниями о System.Diagnostics.Debug и параметре сборки DEBUG в целом, что я могу здесь неправильно понять.





По моему опыту, выбор между отладкой и выпуском в VB.NET не имеет значения. Вы можете добавить собственные действия в обе конфигурации, но по умолчанию я думаю, что они одинаковы.
Использование Release определенно не удалит операторы System.Diagnostics.Debug.Write.
Что я делаю, так это инкапсулирую вызов Debug в моем собственном классе и добавляю директиву прекомпилятора
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
Использование символа компилятора DEBUG, как вы сказали, фактически исключает код из сборки.
Я считаю, что System.Diagnostics.Debug.Write всегда будет выводить в подключенный отладчик, даже если вы построили в режиме Release. Согласно Статья MSDN:
Writes information about the debug to the trace listeners in the Listeners collection.
Если вам не нужен вывод любой, вам нужно обернуть свой вызов в Debug. Запишите константу DEBUG, как сказал Хуан:
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
Предпочтительный метод - это фактическое использование условного атрибута для обертывания ваших отладочных вызовов, а не использование директив компилятора. #ifs может оказаться сложным и привести к странным проблемам при сборке.
Пример использования условного атрибута следующий (в C#, но работает и в VB.NET):
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
Когда вы компилируете без установленного флага DEBUG, любой вызов WriteDebug будет удален, как предполагалось, происходило с Debug.Write ().
Я думаю, что использование ConditionalAttribute означает, что метод по-прежнему является частью фактической сборки выпуска, он просто не загружен. Итак, я могу представить, что единственный способ удаления кода отладки с помощью истинный - использовать директивы компилятора?
Я тоже прочитал эту статью, и это заставило меня поверить, что, когда DEBUG не был определен, ConditionalAttribute, объявленный в функциях System.Debug, заставит компилятор полностью исключить этот код. Я полагаю, что то же самое можно сказать и о TRACE. То есть функции System.Diagnostics.Debug должны иметь ConditionalAttributes для DEBUG и для TRACE. Я ошибался в этом предположении. Отдельный класс Trace имеет те же функции, и они определяют ConditionalAttribute, зависящий от константы TRACE.
Из System.Diagnostics.Debug: _ Общедоступная общая дополнительная запись (_ сообщение как строка _ )
Из System.Diagnostics.Trace: _ Общедоступная общая дополнительная линия записи (_ сообщение как строка _ )
Тогда кажется, что мое первоначальное предположение было правильным, что операторы System.Diagnostics.Debug (или system.Diagnostics.Trace) на самом деле не включаются в компиляцию, как если бы они были включены в регионы #IF DEBUG (или #IF TRACE).
Но я также узнал здесь от вас, ребята, и подтвердил, что сборка RELEASE сама по себе не заботится об этом. По крайней мере, с проектами Silverlight, которые все еще немного нестабильны, вам нужно войти в «Расширенные параметры компиляции ...» и убедиться, что DEBUG не определен.
Мы перешли с .NET 1.1 / VS2003 на .NET 3.5 / VS2008, поэтому я думаю, что некоторые из них работали по-другому, но, возможно, это изменилось в 2.0 / VS2005.
Изучите метод Debug.Write. Он отмечен значком
[Conditional("DEBUG")]
атрибут.
В справке MSDN для ConditionalAttribute указано:
Indicates to compilers that a method call or attribute should be ignored unless a specified conditional compilation symbol is defined.
Имеет ли конфигурация сборки метку выпуска или отладки, не имеет значения, важно, определен ли в ней символ DEBUG.
Чтобы выбрать, хотите ли вы, чтобы отладочная информация была скомпилирована или удалена,
перейдите на вкладку «Сборка» в окне свойств проекта.
Выберите правильную конфигурацию (Active / Release / Debug / All) и убедитесь, что вы проверьте "DEBUG Constant", если вам нужна информация, или снимите флажок, если нет.
Применить изменения и перестроить
Они не то же самое; и режим Release по умолчанию действительно удаляет вызовы Debug.Write из-за того, что к методу применен ConditionalAttribute.