C # - Visual Studio 2008 способна к условной компиляции? - PullRequest
5 голосов
/ 11 июля 2009

Ссылаясь на «Диспетчер конфигурации» в меню «Сборка»,

Есть ли способ прокомментировать мой код C #, чтобы закомментированный код не компилировался, пока решение находится в режиме отладки, но компилировался, если я изменил его в режим выпуска?

Зачем мне это? Причина, по которой я хочу иметь код, который будет скомпилирован в режиме Release, но не в Debug, заключается в том, что у меня есть код, который не будет работать с моего ПК разработчика (код, который отправляет электронные письма с моего хоста и т. Д.)

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

Ответы [ 4 ]

10 голосов
/ 11 июля 2009

Вы можете использовать атрибут Conditional для методов (но не отдельных строк кода) для этой цели

например. Следующее будет скомпилировано только в сборках DEBUG.

[Conditional("DEBUG")]
public void MyMethod()
{
    // Do Stuff
}

Символ DEBUG уже указан в настройках проекта. Вы должны создать свой собственный символ для сборки релиза, скажем «RELEASE», чтобы вы могли сделать это:

[Conditional("RELEASE")]
public void MyMethod()
{
    // Do Stuff
}

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

10 голосов
/ 11 июля 2009

Вы ищете что-то подобное?

#if DEBUG
     Console.WriteLine("Debug Mode");
#else
     Console.WriteLine("Release Mode");
#endif

Если вас интересует только режим разблокировки, вы можете использовать:

#if !DEBUG
     Console.WriteLine("Release Mode");
#endif
4 голосов
/ 11 июля 2009

Я бы попытался решить вашу проблему с помощью объектно-ориентированной техники. Используя внедрение зависимостей , я бы создал класс, который выполняет ваши необходимые действия по отладке.

Что-то вроде:

public class MyClass {

    public MyClass(IDoOtherStuff stuffToDo) {
        DoOtherStuff = stuffToDo;
    }

    private IDoOtherStuff DoOtherStuff { get; set; }

    public void Do() {
        DoOtherStuff.BeforeDo();

        // Blah blah blah..

        DoOtherStuff.AfterDo();
    }
}

public interface IDoOtherStuff {
    void BeforeDo();
    void AfterDo();
}

public class DebugOtherStuff : IDoOtherStuff {
    public void BeforeDo() {
        Debug.WriteLine("At the beginning of Do");
    }

    public void AfterDo() {
        Debug.WriteLine("At the end of Do");
    }
}

public class ReleaseOtherStuff : IDoOtherStuff {
    public void BeforeDo() { }
    public void AfterDo() { }
}

Теперь вы можете использовать Инверсионный контроль контейнер, такой как Виндзор , Unity , Ninject или Spring. NET для настройки среды разработки и среды выпуска.

0 голосов
/ 11 июля 2009

Я могу ошибаться, но я думаю, что комментарии игнорируются компилятором. Если я смотрю на мою сборку, используя .NET Reflector , я не вижу ни одного комментария, который, как мне известно, существует.

Метод BlueMonkMN будет работать для запуска другого кода в зависимости от режима компиляции.

Если вы хотите, чтобы другой код выполнялся в зависимости от того, какой режим компиляции (и другие переменные) вы используете, проверьте PostSharp . Это компилятор посткомпиляции, который может добавлять и удалять код для вашей сборки.

Пример использования: - Я люблю , чтобы иметь подробную информацию об отладке и трассировке для моих проектов. - Я ненавижу с оператором print или trace.write после каждого результата метода или вызова метода, поскольку этот дополнительный код отладки скрывает функцию, выполняющую работу.

Вы можете настроить PostSharp для динамического создания этой дополнительной отладочной информации! Пара настроек, и вы можете распечатывать каждый вызов каждой функции И результат (с переменным содержимым) каждого вызова. Это позволяет очень легко следовать логике программы.

...