Écrire appSettings dans un fichier externe

J’ai un fichier de configuration app.exe.config et la section appSettings ressemble à ceci:

   

Le fichier app.file.config ressemble à ceci:

       

J’ai besoin d’éditer var1, var2 et var3 au moment de l’exécution et j’ai un code comme celui-ci:

 Configuration config = ConfigurationManager.OpenExeConfiguration("...path\app.exe); config.AppSettings.SectionInformation.ConfigSource = "app.file.config"; config.AppSettings.Settings["var1"].Value = "value 11"; config.AppSettings.Settings["var2"].Value = "value 22"; config.AppSettings.Settings["var3"].Value = "value 33"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); 

Quand je lance config.Save …. le fichier app.file.config a un noeud appSettings avec un atsortingbut “fichier”. Cet atsortingbut a la valeur app.file.config.

      

Maintenant, si j’essaie de charger le fichier de configuration, j’ai une exception avec le message “Atsortingbut non reconnu ‘fichier’. Notez que les noms d’atsortingbut sont sensibles à la casse.” dans app.file.config.

Si je supprime l’atsortingbut de fichier manuellement, le fichier de configuration est chargé correctement.

Des idées?

Comment peut éviter d’écrire atsortingbut de fichier lorsque je sauvegarde des fichiers de configuration.

Merci

L’utilisation d’un fichier de configuration externe est transparente pour l’application,

cette partie est ok

    

et aussi ceci:

       

changez votre code pour être comme ça:

 Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings["var1"].Value = "value 11"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); 

référencer un fichier de configuration externe est transparent pour l’application, vous n’avez donc pas à l’appeler directement. vous pouvez utiliser la section appSetting par défaut du gestionnaire de configuration.

Bonne chance

AVERTISSEMENT : configSource n’est pas la bonne réponse, comme indiqué dans d’autres réponses.

Maintenant, pour les mauvaises nouvelles … aucun des fichiers externes ne sera enregistré si vous mettez à jour la valeur lue par ConfigurationManager.

Configuration: fichier app.config du projet Commandline:

    

Fichier AppSettings.config avec ‘Copier dans le répertoire de sortie’ = ‘Copier toujours’

     

Program.cs:

  Console.WriteLine("Local Config sections"); try { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); Console.WriteLine("[test]=" + config.AppSettings.Settings["test"].Value); Console.WriteLine("[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("press the ENTER key to end"); Console.ReadLine(); 

TEST1 – parameters d’application remplacés par le fichier ‘configSource’ de la sous-configuration

Organiser:

Changez app.config pour utiliser ‘configSource’

  

Act: RunProject

Assert: Exception déclenchée: “Les sections ne doivent apparaître qu’une fois par fichier de configuration.”

TEST2 – parameters d’application remplacés par le fichier ‘configSource’ de la sous-configuration

Organiser:

Changez app.config pour utiliser ‘fichier’

  

Act: RunProject

Affirmer:

config.AppSettings.Settings [“test”]. Value = OVERRIDDEN

config.AppSettings.Settings [“testExternalOnly”]. Value = INITIALSTATE

Maintenant pour les mauvaises nouvelles … aucun des fichiers externes ne sera sauvegardé si vous utilisez

 config.AppSettings.Settings["test"].Value = "NEW"; 

Les AppSettings seront uniquement enregistrés dans le fichier .exe.config. Si vous fermez et ouvrez votre configuration, les valeurs seront écrasées par les valeurs du fichier externe.

TEST3 – Les valeurs dans les fichiers externes ne sont pas mises à jour sur ‘config.Save’

Configuration: Program.cs modifié en:

  Console.WriteLine("Local Config sections"); Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); Console.WriteLine("BEFORE[test]=" + config.AppSettings.Settings["test"].Value); Console.WriteLine("BEFORE[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value); config.AppSettings.Settings["test"].Value = "NEW"; config.AppSettings.Settings["testExternalOnly"].Value = "NEWEXTERNAL"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); //Shut current config config = null; //Open config config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); Console.WriteLine("AFTER[test]=" + config.AppSettings.Settings["test"].Value); Console.WriteLine("AFTER[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value); Console.WriteLine("AFTER CONFIG EXTERNAL FILE: " + System.IO.File.ReadAllText("AppSettings.config")); Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config")); 

Act: Programme de course

Affirmer:

La section AppSettings de {myExe} .exe.confg est:

     

AppSettings.config est inchangé

Enfin, j’ai trouvé une solution.

La solution consiste à déclarer le fichier de configuration comme ceci:

      

Et du code

 Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); AppSettingsSection myAppSettings = config.GetSection("appSettings") myAppSettings.Settings["var1"].Value = "value 11"; config.Save(ConfigurationSaveMode.Modified); 

Notez que j’utilise GetSection (“appSettings”) au lieu de config.AppSettings.Settings

Merci à tous ceux qui aident les gens dans StackOverflow.