Вопрос

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

Это было полезно?

Решение

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

Ниже приведен пример использования условного атрибута (на C#, но работает и в VB.NET):

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

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

Другие советы

Изучите Отладка.Запись метод.Он отмечен значком

[Conditional("DEBUG")]

атрибут.

Справка MSDN для Условный атрибут состояния:

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

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

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

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

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

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

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

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

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

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

Из System.Diagnostics.Debug:_ Public shared sub write (_ Сообщение как строка _)

Из System.Diagnostics.Trace:_ Public Shared Sub Writingline (_ Сообщение как строка _)

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

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

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

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

перейдите на вкладку «Сборка» в окне свойств проекта.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top