2008-10-02 4 views
15

Je voudrais remplacer l'utilisation du fichier app.config standard en passant un paramètre de ligne de commande. Comment puis-je modifier le fichier de configuration de l'application par défaut de sorte que lorsque j'accède à ConfigurationManager.AppSettings j'accède au fichier de configuration spécifié sur la ligne de commande?Comment sélectionner un fichier de configuration d'application .Net à partir d'un paramètre de ligne de commande?

Edit:

Il se avère que la bonne façon de charger un fichier de configuration qui est différent du nom du fichier EXE, plus .config est d'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.

Répondre

13

Voici donc le code qui me permet effectivement d'accéder réellement à 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; 
+1

Bonne solution, merci pour le partage. –

2

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

+0

Merci pour tout le soutien des gars et des filles. Même si vous ne l'aimez pas, cela fonctionne. Dernièrement, mon approche est un -c = fichier.config et une application de console générique et une approche de Darrel. J'ai toujours l'application console générique copier le fichier theapp.exe.config à theapp.exe, pour tromper .NET. – kenny

+1

Ceci est la seule réponse (y compris la réponse acceptée) qui permet d'obtenir le résultat souhaité. –

+0

Cette solution présente plusieurs inconvénients. Le plus important: Autant que je sache, une application ne doit pas modifier les fichiers sous le dossier Program Files. Alors, quel sens cela fait-il de placer le fichier de configuration à côté du fichier exe en général? L'application n'est alors pas capable de modifier sa propre configuration. C'est en général un bon style de placer la configuration de l'application dans le répertoire personnel de l'utilisateur. Toutefois, Windows manque toujours d'un répertoire de fichiers de configuration centrale comme/etc afin de placer des fichiers de configuration à l'échelle du système. – realtime

0

Ce n'est pas exactement ce que vous voulez ... pour rediriger l'objet statique réel ConfigurationManager pour pointer sur un chemin différent. Mais je pense que c'est la bonne solution à votre problème. Consultez la méthode OpenExeConfiguration sur la classe ConfigurationManager.

Si la méthode ci-dessus n'est pas ce que vous cherchez, je pense qu'il serait également intéressant d'utiliser le Configuration capabilities du framework Enterprise Library (développé et maintenu par l'équipe Microsoft Patterns & Practices).

Spécifiquement jeter un oeil à la classe FileConfigurationSource.

Voici un code qui met en évidence l'utilisation du FileConfigurationSource de Enterprise Library, je crois que cela répond pleinement à vos objectifs. Le seul assemblage dont vous avez besoin de Ent Lib pour cela est 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 
} 
+0

La chose étrange à propos de cet exemple est qu'il va charger le fichier de configuration par défaut. Si je change l'exePath pour être autre chose, OpenExeConfiguration échoue. –

+0

Je vais vous obtenir un échantillon de code dans les 20 prochaines minutes, mais je suis allé de l'avant et mis à jour avec une alternative potentielle. –

+0

Ironiquement, cette application utilise réellement le CAB du groupe P & P. ​​Cependant, j'ai extrait toutes les choses EntLib car elles sont trop lourdes pour moi. Je pense sérieusement à bourrer un fichier XML dans le dossier. Ce serait tellement plus facile. –

1

je devais le faire pour une application de la mienne aussi, et de traiter les objets configuration standards transformés en un tel connerie sans tracas pour un tel concept simple que je suis allé dans cette voie:

  1. Gardez plusieurs fichiers de configuration au format XML similaire à app.Config
  2. Chargez le fichier de configuration spécifié dans un DataSet (via .ReadXML), et utiliser le DataTable avec les informations de configuration en tant que mon Configu objet de ration.
  3. Donc, tout mon code traite uniquement le Configuration DataTable pour récupérer des valeurs et non cet objet de configuration d'application obscurément déformé.

alors je peux passer dans tout ce que le nom de fichier config j'ai besoin sur la ligne de commande et si l'on est pas là - il suffit de charger app.config dans le DataSet .

Jeezus c'était tellement plus simple après ça.:-)

Ron

+0

Je vous entends. Je continue d'attendre le jour où je me rends compte, oh c'est l'avantage d'utiliser les fichiers .config. Ce jour n'est pas venu. –

1

Ceci est la partie pertinente de la source pour l'application qui utilise config par défaut et accepte outrepasser via la ligne de commande:

Get config actuelle ou de l'utilisateur dans l'objet 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); 

Utiliser l'objet de configuration

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