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

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

Edit:

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

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

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

Ответы [ 5 ]

14 голосов
/ 02 октября 2008

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

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

1 голос
/ 07 июля 2009

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

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

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

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

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

Боже, после этого все стало намного проще. : -)

Рон

0 голосов
/ 02 октября 2008

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

Если вышеприведенный метод не тот, который вам нужен, я думаю, также стоит взглянуть на использование возможностей конфигурации платформы Enterprise Library (разработанной и поддерживаемой Microsoft Patterns & 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'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
}
...