Как мне выбрать .Файл конфигурации сетевого приложения из параметра командной строки?

StackOverflow https://stackoverflow.com/questions/163803

Вопрос

Я хотел бы переопределить использование стандартного app.config, передав параметр командной строки.Как мне изменить файл конфигурации приложения по умолчанию, чтобы при доступе к ConfigurationManager.AppSettings я получал доступ к файлу конфигурации, указанному в командной строке?

Редактировать:

Оказывается, что правильный способ загрузить конфигурационный файл, который отличается от имени EXE plus .config, - это использовать OpenMappedExeConfiguration.Например.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Shell2.exe.config");
currentConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

Это частично работает.Я могу видеть все ключи в разделе AppSettings, но все значения равны null.

Это было полезно?

Решение

Итак, вот код, который на самом деле позволяет мне получить доступ к разделу AppSettings в файле конфигурации, отличном от файла по умолчанию.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Alternate.config");
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
string MySetting = section.Settings["MySetting"].Value;

Другие советы

Пакетный файл, который копирует нужный вам файл конфигурации в appname.exe.config, а затем запускает appname.exe.

Мне нужно было сделать это и для моего приложения, и работа со стандартными объектами конфигурации превратилась в такую чертову проблему для такой простой концепции, что я пошел этим путем:

  1. Храните несколько конфигурационных файлов в формате XML, аналогичном app.config
  2. Загрузите указанный конфигурационный файл в Набор данных (через .ReadXml), и используйте Поддающийся обработке данными с конфигурационной информацией в нем в качестве моего Объект конфигурации.
  3. Таким образом, весь мой код просто имеет дело с Данные о конфигурации доступны чтобы извлекать значения, а не этот дерьмово запутанный объект конфигурации приложения.

затем я могу передать любое имя файла конфигурации, которое мне нужно, в командной строке, и если его там нет - просто загрузите app.config в Набор данных.

Господи, после этого все стало ооочень намного проще.:-)

Рон

Это соответствующая часть исходного кода для приложения, которая использует конфигурацию по умолчанию и принимает переопределение через командную строку:

Получить текущую конфигурацию или конфигурацию пользователя в объекте Config

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
string defCfgName = Environment.GetCommandLineArgs()[0] + ".config";

if (arg.Length != 0)
{
    string ConfigFileName = arg[0];
    if (!File.Exists(ConfigFileName))
        Fatal("File doesn't exist: " + ConfigFileName, -1);                
    config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = ConfigFileName }, ConfigurationUserLevel.None);
}
else if (!File.Exists(defCfgName)) Fatal("Default configuration file doesn't exist and no override is set." , -1);

Используйте объект конфигурации

AppSettingsSection s = (AppSettingsSection)config.GetSection("appSettings");
KeyValueConfigurationCollection a = s.Settings;
ConnectionString = a["ConnectionString"].Value;

Это не совсем то, чего вы хотите...чтобы перенаправить фактический ConfigurationManager статический объект, указывающий на другой путь.Но я думаю, что это правильное решение вашей проблемы.Ознакомьтесь с OpenExeConfiguration метод на ConfigurationManager класс.

Если описанный выше метод - это не то, что вы ищете, я думаю, также стоило бы взглянуть на использование Возможности настройки платформы Enterprise Library framework (разработана и поддерживается командой Microsoft Patterns & Practices).

В частности, взгляните на FileConfigurationSource класс.

Вот некоторый код, который подчеркивает использование FileConfigurationSource От Корпоративная библиотека, Я считаю, что это полностью соответствует вашим целям.Единственная сборка, которая вам нужна из Ent Lib для этого, это Microsoft.Practices.EnterpriseLibrary.Common.dll.

static void Main(string[] args)
{
    //read from current app.config as default
    AppSettingsSection ass = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings;

    //if args[0] is a valid file path assume it's a config for this example and attempt to load
    if (args.Length > 0 && File.Exists(args[0]))
    {
        //using FileConfigurationSource from Enterprise Library
        FileConfigurationSource fcs = new FileConfigurationSource(args[0]);
        ass = (AppSettingsSection) fcs.GetSection("appSettings");
    }

    //print value from configuration
    Console.WriteLine(ass.Settings["test"].Value);
    Console.ReadLine(); //pause
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top