Действительно ли Visual Studio является 2008, способным к условной компиляции для C#?

Что касается "Менеджера конфигурации" в соответствии с меню Build,

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

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

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

5
задан Peter Mortensen 6 September 2019 в 09:31
поделиться

4 ответа

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

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

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

#if !DEBUG
     Console.WriteLine("Release Mode");
#endif
10
ответ дан 18 December 2019 в 07:31
поделиться

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

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

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

Пример использования: - Я люблю получать подробную информацию об отладке и трассировке моих проектов. - I hate having a print or trace.write statement after every method result or method call, as this extra debugging code obscures the function doing the work.

You can configure PostSharp to create this extra debug information dynamically! A couple of configuration tweaks and you can have every call to every function printed AND the result (with variable contents) from each call. This makes it very easy to follow the program logic flow.

-3
ответ дан 18 December 2019 в 07:31
поделиться

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

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

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

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

10
ответ дан 18 December 2019 в 07:31
поделиться

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

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

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

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

4
ответ дан 18 December 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: