Ceci est mon App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="lang" value="English"/>
</appSettings>
</configuration>
Avec ce code je fais le changement
lang = "Russian";
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
}
Mais ça ne change pas. Qu'est-ce que je fais mal?
Vous ne pouvez pas utiliser d'objet statique AppSettings pour cela. Essaye ça
string appPath = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location);
string configFile = System.IO.Path.Combine(appPath, "App.config");
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = configFile;
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
config.AppSettings.Settings["YourThing"].Value = "New Value";
config.Save();
AppSettings.Set
Ne conserve pas les modifications apportées à votre fichier de configuration. Cela change simplement en mémoire. Si vous mettez un point d'arrêt sur System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
et ajoutez une surveillance pour System.Configuration.ConfigurationManager.AppSettings[0]
, Vous verrez qu'il passera de "anglais" à "russe" lorsque cette ligne de code sera exécutée.
Le code suivant (utilisé dans une application console) persistera la modification.
class Program
{
static void Main(string[] args)
{
UpdateSetting("lang", "Russian");
}
private static void UpdateSetting(string key, string value)
{
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
configuration.AppSettings.Settings[key].Value = value;
configuration.Save();
ConfigurationManager.RefreshSection("appSettings");
}
}
De cette publication: http://vbcity.com/forums/t/152772.aspx
Un point important à noter avec ce qui précède est que si vous exécutez cela à partir du débogueur (dans Visual Studio), le fichier app.config sera écrasé à chaque fois que vous construisez. Le meilleur moyen de tester ceci est de créer votre application, puis d'accéder au répertoire de sortie et de lancer votre exécutable à partir de celui-ci. Dans le répertoire de sortie, vous trouverez également un fichier nommé YourApplicationName.exe.config, qui est votre fichier de configuration. Ouvrez-le dans le Bloc-notes pour voir que les modifications ont bien été enregistrées.
lorsque vous utilisez "ConfigurationUserLevel.None", votre code est exécuté correctement lorsque vous cliquez sur nomvotre application.exe dans le dossier de débogage. .
mais lorsque vous développez une application en mode visuel, la bonne marche n'est pas faite !! parce que "vshost.exe" est exécuté.
le paramètre suivant résout ce problème: "Application.ExecutablePath"
essayez ceci: (Testé dans VS 2012 Express For Desktop)
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["PortName"].Value = "com3";
config.Save(ConfigurationSaveMode.Minimal);
mon anglais n'est pas bon, je suis désolé.
Cela a fonctionné pour moi dans l'application WPF:
string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
private static string GetSetting(string key)
{
return ConfigurationManager.AppSettings[key];
}
private static void SetSetting(string key, string value)
{
Configuration configuration =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
configuration.AppSettings.Settings[key].Value = value;
configuration.Save(ConfigurationSaveMode.Full, true);
ConfigurationManager.RefreshSection("appSettings");
}
En plus de la réponse de fenix2222 (qui a fonctionné pour moi), j'ai dû modifier la dernière ligne pour:
config.Save(ConfigurationSaveMode.Modified);
Sans cela, la nouvelle valeur était toujours en cours d'écriture dans le fichier de configuration, mais l'ancienne valeur était récupérée lors du débogage.
Merci Jahmic pour la réponse. A bien fonctionné pour moi.
un autre extrait de code utile qui lit les valeurs et renvoie une chaîne:
public static string ReadSetting(string key)
{
System.Configuration.Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
System.Configuration.AppSettingsSection appSettings = (System.Configuration.AppSettingsSection)cfg.GetSection("appSettings");
return appSettings.Settings[key].Value;
}
Pour mettre à jour des entrées autres que appsettings
, utilisez simplement XmlDocument
.
public static void UpdateAppConfig(string tagName, string attributeName, string value)
{
var doc = new XmlDocument();
doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
var tags = doc.GetElementsByTagName(tagName);
foreach (XmlNode item in tags)
{
var attribute = item.Attributes[attributeName];
if (!ReferenceEquals(null, attribute))
attribute.Value = value;
}
doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
}
Voici comment vous l'appelez:
Utility.UpdateAppConfig("endpoint", "address", "http://localhost:19092/NotificationSvc/Notification.svc");
Utility.UpdateAppConfig("network", "Host", "abc.com.au");
Cette méthode peut également être améliorée pour prendre en compte les valeurs appSettings.
Pour une application console .NET 4.0, aucune de ces solutions ne fonctionnait pour moi. J'ai donc modifié la réponse de Kevn Aenmey comme ci-dessous et cela a fonctionné:
private static void UpdateSetting(string key, string value)
{
Configuration configuration = ConfigurationManager.
OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
configuration.AppSettings.Settings[key].Value = value;
configuration.Save();
ConfigurationManager.RefreshSection("appSettings");
}
Seule la première ligne est différente, construite sur l’Assemblée d’exécution réelle.