Как получить конфигурацию сборки во время выполнения?

Кто-нибудь знает, как получить текущую конфигурацию сборки $(Configuration) в коде С#?

Ответ 1

Вы не можете, не совсем. Что вы можете сделать, это определить некоторые "условные символы компиляции", если вы посмотрите на страницу "Build" настроек вашего проекта, вы можете установить их там, чтобы вы могли написать операторы #if для их проверки.

Символ отладки автоматически вводится (по умолчанию его можно отключить) для отладочных сборок.

Таким образом, вы можете написать код, подобный этому

#if DEBUG
        RunMyDEBUGRoutine();
#else
        RunMyRELEASERoutine();
#endif

Однако не делайте этого, если у вас нет веских причин. Приложение, которое работает по-разному между сборками отладки и выпуска, никому не нужно.

Ответ 2

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

<Target Name="BeforeBuild">
    <WriteLinesToFile File="$(OutputPath)\env.config" 
                      Lines="$(Configuration)" Overwrite="true">
    </WriteLinesToFile>
</Target>

Ответ 3

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

Пример, показывающий, как определить символ UNOEURO и как его использовать в коде.

UNOEURO symbol defined here

bool isUnoeuro = false;
#if UNOEURO
    isUnoeuro = true;
#endif

Ответ 4

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

См. это сообщение в блоге о том, как делать файлы конфигурации с несколькими средами, используя MSBuild - http://adeneys.wordpress.com/2009/04/17/multi-environment-config/

В качестве альтернативы вы можете написать задачу MSBuild, которая будет редактировать определенный скомпилированный файл (ваш файл С# или VB) и выполнить этот запуск в задаче BeforeBuild. Это было бы довольно сложно, так как вам нужно было решить, куда его вставлять в файл, но при условии, что у вас установлена ​​какая-то токенизация, вы должны это сделать. Я также сомневаюсь, что это будет красиво!

Ответ 5

Вы можете использовать общий статический метод с условным атрибутом, чтобы установить флаг для обнаружения режима DEBUG или RELEASE. Метод SetDebugMode будет вызываться только при работе в режиме DEBUG, в противном случае он игнорируется средой выполнения.

public static class AppCompilationConfiguration
{
    private static bool debugMode;

    private static bool IsDebugMode()
    {
        SetDebugMode();
        return debugMode;
    }

    //This method will be loaded only in the case of DEBUG mode. 
    //In RELEASE mode, all the calls to this method will be ignored by runtime.
    [Conditional("DEBUG")]
    private static void SetDebugMode()
    {
        debugMode = true;
    }

    public static string CompilationMode => IsDebugMode() ? "DEBUG" : "RELEASE";

}

Вы можете позвонить в код, как показано ниже

 Console.WriteLine(AppCompilationConfiguration.CompilationMode);