这是我的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);
}
但它没有改变。我做错了什么?
答案 0 :(得分:87)
AppSettings.Set
不会将更改保留在配置文件中。它只是在内存中改变它。如果您在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");
}
}
来自这篇文章: http://vbcity.com/forums/t/152772.aspx
上面提到的一个要点是,如果从调试器(在Visual Studio中)运行它,那么每次构建时都会覆盖app.config文件。测试此方法的最佳方法是构建应用程序,然后导航到输出目录并从那里启动可执行文件。在输出目录中,您还可以找到名为YourApplicationName.exe.config的文件,它是您的配置文件。在记事本中打开它,看看实际上已经保存了更改。
答案 1 :(得分:45)
您无法使用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();
答案 2 :(得分:10)
使用&#34; ConfigurationUserLevel.None &#34;单击调试文件夹中的nameyourapp.exe时,您的代码正确运行。 。
但是当你在visual stdio上开发应用程序时没有正确运行!!因为&#34; vshost.exe&#34;跑了。
以下参数解决了这个问题: &#34;的 Application.ExecutablePath 强>&#34;
试试这个:(在VS 2012 Express For Desktop中测试)
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["PortName"].Value = "com3";
config.Save(ConfigurationSaveMode.Minimal);
我的英语不好,对不起。
答案 3 :(得分:6)
在WPF应用程序中对我有用:
string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
答案 4 :(得分:2)
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");
}
答案 5 :(得分:2)
除了fenix2222的答案(对我有用),我不得不修改最后一行:
config.Save(ConfigurationSaveMode.Modified);
如果没有这个,新值仍然会写入配置文件,但在调试时会检索旧值。
答案 6 :(得分:1)
对于.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");
}
只有第一行是不同的,在实际执行的程序集上构造。
答案 7 :(得分:1)
感谢Jahmic的回答。 为我工作得很好。
另一个有用的代码片段,它读取值并返回一个字符串:
hasNext
答案 8 :(得分:1)
要更新appsettings
以外的条目,只需使用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);
}
这是您的称呼方式:
Utility.UpdateAppConfig("endpoint", "address", "http://localhost:19092/NotificationSvc/Notification.svc");
Utility.UpdateAppConfig("network", "host", "abc.com.au");
可以改进此方法来满足appSettings值。