Можно ли переключить файл конфигурации приложения во время выполнения для приложения .NET? - PullRequest
9 голосов
/ 28 октября 2008

По умолчанию файл конфигурации приложения .NET назван в честь "exe file name" .config. Мне интересно, возможно ли динамическое указание конфигурации одного приложения.

Например, встроенным приложением является «foo.exe». Во время выполнения файл конфигурации называется «foo.exe.config». Можно ли заставить его принимать аргументы командной строки, чтобы использовать другой файл конфигурации. Таким образом, приложение может использовать другую конфигурацию, как показано ниже.

foo.exe /config:bar.config

bar.config используется как файл конфигурации вместо foo.exe.config.

Ответы [ 4 ]

11 голосов
/ 20 ноября 2008

Все вышеперечисленное работает хорошо, если вам нужно заменить только раздел AppSettings.

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

Вот код, который работал для меня:

        AppDomainSetup setup = new AppDomainSetup();
        setup.ApplicationBase = "file://" + System.Environment.CurrentDirectory;
        setup.DisallowBindingRedirects = true;
        setup.DisallowCodeDownload = true;

        if (args.Length != 0 && args[0].Equals("-test"))
        {
            setup.ConfigurationFile = "PATH_TO_YOUR_TEST_CONFIG_FILE";
        }
        else {
            setup.ConfigurationFile = "PATH_TO_YOUR_LIVE_CONFIG_FILE";
        }

        AppDomain domain = AppDomain.CreateDomain("FRIENDLY_NAME", null, setup);
        domain.ExecuteAssembly("YourMainApp.exe");
4 голосов
/ 28 октября 2008

Код от MSDN

static void DisplayMappedExeConfigurationFileSections()
{
    // Get the application configuration file path.
    string exeFilePath = System.IO.Path.Combine(
        Environment.CurrentDirectory, "ConfigurationManager.exe.config");
    // HERE !!!     
    // Map to the application configuration file.
    ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
    configFile.ExeConfigFilename = exeFilePath;

    Configuration config =
        ConfigurationManager.OpenMappedExeConfiguration(configFile,
        ConfigurationUserLevel.None);

    // Display the configuration file sections.
    ConfigurationSectionCollection sections = config.Sections;

    Console.WriteLine();
    Console.WriteLine("Sections in machine.config:");

    // Loop to get the sections machine.config.
    foreach (ConfigurationSection section in sections)
    {
        string name = section.SectionInformation.Name;
        Console.WriteLine("Name: {0}", name);
    }

}
3 голосов
/ 28 октября 2008

Получено от Как использовать Configuration.GetSection () и ConfigurationManager.OpenMappedExeConfiguration ()

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"C:\Inetpub\Test\Config\Dev.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
string ConfigVersion = section.Settings["ConfigVersion"].Value;
0 голосов
/ 28 октября 2008

Да, вам нужно использовать ExeConfigurationFileMap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...