App.Config更改值
这是我的App.Config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="lang" value="English"/> </appSettings> </configuration>
有了这个代码我做了改变
lang = "Russian"; private void Main_FormClosing(object sender, FormClosingEventArgs e) { System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); }
但它不会改变。 我做错了什么?
你不能使用AppSettings的静态对象。 尝试这个
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
不会将更改持久保存到configuration文件中。 它只是改变它在内存中。 如果你在System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
上放置一个断点System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
,并添加监视System.Configuration.ConfigurationManager.AppSettings[0]
你会看到它从“英语”更改为“俄罗斯”时,该行的代码运行。
以下代码(在控制台应用程序中使用)将保持更改。
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"); } }
从这个post: http : //vbcity.com/forums/t/152772.aspx
需要注意的一点是,如果你是从debugging器(在Visual Studio中)运行这个,那么app.config文件将在每次构build时被覆盖。 testing这个最好的方法是构build你的应用程序,然后导航到输出目录并从那里启动你的可执行文件。 在输出目录中,您还将find一个名为YourApplicationName.exe.config的文件,它是您的configuration文件。 在记事本中打开它,看看事实上已经保存了更改。
当使用“ ConfigurationUserLevel.None ”时,在debug文件夹中的nameyourapp.exe中单击时,您的代码正确运行。 。
但是当你的视觉stdio开发应用程序不正确的运行! 因为“vshost.exe”正在运行。
下面的参数解决了这个问题:“ Application.ExecutablePath ”
试试这个:(在VS 2012 Express For Desktop中testing)
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings["PortName"].Value = "com3"; config.Save(ConfigurationSaveMode.Minimal);
我的英语不好,我很抱歉。
这对我在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"); }
除了fenix2222(为我工作)的答案,我不得不修改最后一行:
config.Save(ConfigurationSaveMode.Modified);
如果没有这个,新的值仍然被写入到configuration文件中,但debugging时检索到旧的值。
对于.NET 4.0控制台应用程序,这些都不适合我。 所以我修改了Kevn Aenmey的答案,如下所示:
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"); }
只有第一行是不同的,build立在实际执行的程序集上。
谢谢Jahmic的答案。 为我工作正常。
另一个有用的代码片段,读取值并返回一个string:
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; }