Подтвердить что ты не робот

Компилятор .NET - DEBUG против RELEASE

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

4b9b3361

Ответ 1

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

Пример использования условного атрибута следующий (в С#, но работает и в VB.NET):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

Когда вы компилируете без установленного флага DEBUG, любой вызов WriteDebug будет удален, как предполагалось, с Debug.Write().

Ответ 2

Изучите метод Debug.Write. Он отмечен символом

[Conditional("DEBUG")]

атрибут.

В справке MSDN для ConditionalAttribute указано:

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

Независимо от того, имеет ли конфигурация сборки метка выпуска или отладки, имеет значение, определен ли в ней символ DEBUG.

Ответ 3

Что я делаю, это инкапсулировать вызов Debug в моем собственном классе и добавить директиву прекомпилятора

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}

Ответ 4

Использование символа компилятора DEBUG будет, как вы сказали, фактически опустить код из сборки.

Я считаю, что System.Diagnostics.Debug.Write всегда будет выводиться на подключенный отладчик, даже если вы создали режим Release. В Статья MSDN:

Записывает информацию об отладке слушателям трассировки в коллекции Listeners.

Если вам не нужен какой-либо вывод, вам нужно будет обернуть свой вызов Debug.Write с константой DEBUG, как сказал Хуан:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif

Ответ 5

Я тоже прочитал статью, и это заставило меня поверить, что когда DEBUG не был определен, что ConditionalAttribute, объявленный в функциях System.Debug, заставит компилятор полностью исключить этот код. Я полагаю, что то же самое верно для TRACE. То есть функции System.Diagnostics.Debug должны иметь условные атрибуты для DEBUG и для TRACE. Я ошибался в этом предположении. Отдельный класс Trace имеет те же функции, и они определяют условный атрибут, зависящий от константы TRACE.

Из System.Diagnostics.Debug:  _ Public Shared Sub Write (_   сообщение As String _ )

Из System.Diagnostics.Trace:  _ Public Shared Sub WriteLine (_   сообщение As String _ )

Кажется, что мое первоначальное предположение было правильным, что заявления System.Diagnostics.Debug(или system.Diagnostics.Trace) на самом деле не включены в компиляцию, как если бы они были включены в области #IF DEBUG (или #IF TRACE),

Но я также узнал от вас, ребята, и подтвердил, что сборник RELEASE сам по себе не позаботится об этом. По крайней мере, с проектами Silverlight, которые все еще немного шелушатся, вам нужно войти в "Расширенные параметры компиляции..." и убедиться, что DEBUG не определен.

Мы прыгали с .NET 1.1/VS2003 на .NET 3.5/VS2008, поэтому я думаю, что некоторые из них использовались для работы по-другому, но, возможно, это изменилось в версии 2.0/VS2005.

Ответ 6

Чтобы выбрать, нужно ли компилировать или удалять информацию об отладке,

введите вкладку "Создать" в окне свойств проекта.

Выберите правильную конфигурацию (Active/Release/Debug/All) и убедитесь, что вы проверьте "DEBUG Constant", если вы хотите получить информацию, или снимите флажок, если вы этого не сделаете.

Применить изменения и перестроить

Ответ 7

В моем опыте выбор между Debug и Release в VB.NET не имеет значения. Вы можете добавлять настраиваемые действия для обеих конфигураций, но по умолчанию я думаю, что они одинаковы.

Использование Release, безусловно, не приведет к удалению операторов System.Diagnostics.Debug.Write.