Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Отладочные метки XML


Автор: LLlaMaH 25.1.2008, 11:04
я попробую пояснить суть вопроса:


есть препроцессорный набор:


#define DEBUG

#if (DEBUG)
        MessageBox.Show("TEST");
#else 
            MessageBox.Show("OK");
#endif


если переменная DEBUG объявлена то сработает ТЕСТ а если не объявлена то сработает ОК

меня интересует возможно ли сделать что то аналогичное  в шарпе с помощью (не знаю правильного термина, ну это такие штуки которые в квадратных скобках ставятся перед классом или переменной) что бы при выборе типа сборки Debug или Release у меня допустим в итоговую сборку не попадали некоторые функции используемые мной для отладки. для примера приведу некорректную строку =)

[что_то_нужное]
bool TestClass()
{
}


мне нуно чтобы эта функция не попала в  релизовую сборку..

Автор: PPS05 25.1.2008, 22:38
LLlaMaH, если правильно понял, http://www.programming-systems.ru/about/clause/411/279260/ - то, что нужно - аттрибут Conditional.

Автор: LLlaMaH 27.1.2008, 16:41
нет...это немного не то....по ссылке описание того что я написал....про #define

а меня интересует (я узнал как это называется) атрибут класса.
например у меня отладочный класс для nunit, в нем есть метод:

Код

[Test]
void Test()
{
}


Перед методом стоит атрибут [Test]
для того чтобы NUnit могла тестировать сборку.

Меня интересует аттрибут который нужно поставить перед методом и он вкомпилировлскя в сборку в зависимости от режима компиляции Debug или Release. И вообще возможно ли такое?

Автор: mr.DUDA 27.1.2008, 16:49
Цитата(LLlaMaH @  27.1.2008,  15:41 Найти цитируемый пост)
Меня интересует аттрибут который нужно поставить перед методом и он вкомпилировлскя в сборку в зависимости от режима компиляции Debug или Release. И вообще возможно ли такое?


PPS05 правильно сказал про атрибут Conditional. Это "как раз-таки то".
Код
using System;
using System.Diagnostics;

class Program
{
    [Conditional("DEBUG")]
    void DoOnlyIfDebug()
    {
        Console.WriteLine("this is debug method");
    }

    [Conditional("RELEASE")]
    void DoOnlyIfRelease()
    {
        Console.WriteLine("this is release method");
    }

    static void Main()
    {
        Program prog = new Program();

        prog.DoOnlyIfDebug();
        prog.DoOnlyIfRelease();
    }
}


Если скомпилировать в режиме Debug, прога выдаст только первую строку. В Release только вторую. То есть вызовы методов просто будут игнорироваться, если не определена константа указанная в атрибуте над методом.

Так как по умолчанию константа препроцессора RELEASE не добавляется, нужно добавить её вручную. Окно свойств проекта, закладка Build, написать слово RELEASE в поле Conditional compilation symbols.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)