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

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

Edit:

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

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

Это частично работает. Я вижу все ключи в разделе appSettings, но все значения равны нулю.

Ответы

Ответ 1

Итак, вот код, который фактически позволяет мне фактически получить доступ к разделу 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;

Ответ 2

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

Ответ 3

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

  • Храните несколько файлов конфигурации в формате XML, аналогичном app.config
  • Загрузите указанный файл конфигурации в DataSet (через .ReadXML) и используйте DataTable с информацией о конфигурации в нем как мой объект конфигурации.
  • Таким образом, весь мой код просто использует Конфигурация DataTable для извлечения значений, а не для этого безумного обфусканного объекта конфигурации приложения.

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

Jeezus после этого было намного проще.: -)

Рон

Ответ 4

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

Получить текущую или пользовательскую конфигурацию в объекте 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;

Ответ 5

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

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

В частности, посмотрите класс FileConfigurationSource.

Вот какой код, который подчеркивает использование FileConfigurationSource из Enterprise Library, я считаю, что это полностью соответствует вашим целям. Единственная сборка, которая вам нужна из 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 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
}