我正在尝试以编程方式添加密钥并将其保存到我的 App.config 文件中。我的代码如下,我见过很多这样的不同示例,但我的代码不起作用。我正在尝试添加一个全新的密钥,而不是修改现有的密钥。这是一个控制台应用程序,我确实添加了对 System.configuration 的引用。
程序.cs
using System;
using System.Linq;
using System.Text;
using System.Configuration;
namespace AddValuesToConfig
{
class Program
{
static void Main(string[] args)
{
System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Add("key1", "value");
// Save the changes in App.config file.
config.Save(ConfigurationSaveMode.Modified);
}
}
}
应用程序配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
</appSettings>
</configuration>
您很可能在 Visual Studio 的调试器下运行此代码。事实是,当您执行此操作时,Visual Studio 实际上运行的不是 YourApp.exe,而是 YourApp.vshost.exe 文件。这意味着您要将密钥添加到 YourApp.vshost.exe.config 文件而不是 YourApp.exe.config。尝试在没有调试器的情况下运行,它应该可以工作。
编辑以回答下面的评论。主题发起者声称 VS 在调试时甚至不写入 .vshost.exe.config,我认为这是真的。然而,很少有调查表明它确实写入 .vshost.config.exe 文件,但是当您停止调试时,它会用 .exe.config 覆盖 .vshost.exe.config 的内容。因此,在调试会话结束后,您可能会认为它根本没有写入任何内容。但是,如果您在 config.Save() 语句之后放置断点并打开 .vshost.exe.config 文件 - 您将看到那里的更改。
用于写入:
public static bool SetAppSettings<TType>(string key, TType value)
{
try
{
if (string.IsNullOrEmpty(key))
return false;
Configuration appConfig = ConfigurationManager.OpenExeConfiguration(GetCurrentApplicationPath());
AppSettingsSection appSettings = (AppSettingsSection)appConfig.GetSection("appSettings");
if (appSettings.Settings[key] == null)
appSettings.Settings.Add(key, value.ToString());
else
appSettings.Settings[key].Value = value.ToString();
appConfig.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
return true;
}
catch
{
return false;
}
}
供阅读:
public static TType GetAppSettings<TType>(string key, TType defaultValue = default(TType))
{
try
{
if (string.IsNullOrEmpty(key))
return defaultValue;
AppSettingsReader appSettings = new AppSettingsReader();
return (TType)appSettings.GetValue(key, typeof(TType));
}
catch
{
return defaultValue;
}
}
这对我有用:
ConfigurationManager.AppSettings.Set(item.Key, item.Value);