Comment sélectionner un fichier de configuration d'application .Net à partir d'un paramètre de ligne de commande?

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

Question

J'aimerais remplacer l'utilisation de l'app.config standard en transmettant un paramètre de ligne de commande. Comment modifier le fichier de configuration par défaut de l'application de sorte que, lorsque j'accède à ConfigurationManager.AppSettings, j'accède au fichier de configuration spécifié sur la ligne de commande?

Modifier:

Il s'avère que la méthode correcte pour charger un fichier de configuration différent du nom du fichier EXE plus .config consiste à utiliser OpenMappedExeConfiguration. Par exemple.

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

Cela fonctionne partiellement. Je peux voir toutes les clés dans la section appSettings mais toutes les valeurs sont nulles.

Était-ce utile?

La solution

Voici donc le code qui me permet réellement d'accéder à la section appSettings dans un fichier de configuration autre que celui par défaut.

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;

Autres conseils

Un fichier de commandes qui copie le fichier de configuration souhaité dans appname.exe.config puis exécute l'appname.exe.

Je devais le faire aussi pour une de mes applications, et le traitement des objets de configuration standard s'est avéré si compliqué pour un concept si simple que j'ai choisi cette voie:

  1. Conservez plusieurs fichiers de configuration au format XML similaires à app.config
  2. Chargez le fichier de configuration spécifié dans un ensemble de données (via .ReadXML) et utilisez DataTable avec les informations de configuration qu'il contient comme objet de configuration .
  3. Ainsi, tout mon code traite uniquement de la Configuration DataTable pour récupérer des valeurs et non de cet objet de configuration d'application obscurément obscurci.

je peux alors indiquer le nom du fichier de configuration dont j'ai besoin sur la ligne de commande et s'il n'y en a pas - il suffit de charger app.config dans le ensemble de données .

Jezus, c’était bien plus simple après cela. : -)

Ron

Il s'agit de la partie pertinente de la source de l'application qui utilise la configuration par défaut et accepte le remplacement via la ligne de commande:

Obtenir la configuration actuelle ou utilisateur dans l'objet de configuration

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);

Utiliser l'objet de configuration

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

Ce n’est pas exactement ce que vous souhaitez ... rediriger le contenu ConfigurationManager un objet statique vers un chemin différent. Mais je pense que c'est la bonne solution à votre problème. Découvrez la méthode OpenExeConfiguration sur la page ConfigurationManager .

Si la méthode ci-dessus ne correspond pas à ce que vous recherchez, je pense qu'il serait également utile de jeter un coup d'œil à l'utilisation de Fonctionnalités de configuration de l'infrastructure de la bibliothèque d'entreprise (développée et gérée par l'équipe Microsoft Patterns & Practices).

En particulier, consultez FileConfigurationSource .

Voici un code mettant en évidence l'utilisation du FileConfigurationSource à partir de

scroll top