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

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

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

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

5
Chaddeus 11 Июл 2009 в 16:58

4 ответа

Лучший ответ

Возможно, вы ищете что-то вроде этого:

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

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

#if !DEBUG
     Console.WriteLine("Release Mode");
#endif
10
Peter Mortensen 6 Сен 2019 в 09:31

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

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

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

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

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

-3
Peter Mortensen 26 Июл 2012 в 18:54

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

Что-то типа:

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() { }
}

Теперь вы можете использовать контейнер Inversion of control, например Windsor, Unity < / a>, Ninject или Spring.NET, чтобы настроить среду разработки и среду выпуска.

4
Peter Mortensen 26 Июл 2012 в 17:49

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

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

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

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

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

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

10
Peter Mortensen 6 Сен 2019 в 09:33