对于我的项目,我需要一个与可执行文件存储在同一文件夹中的配置,并且用户可以轻松访问和编辑。我在包中找到了解决此问题的方法System.Configuration
,但现在遇到了问题。问题是,当我尝试保存配置文件时,它会创建它,但会用我认为是默认值的值填充所有值(因此字符串为空字符串,或Black
for ConsoleColor
)
要保存并稍后检查配置,我使用以下代码:
static void Main()
{
#if DEBUG
string applicationName =
Environment.GetCommandLineArgs()[0];
#else
string applicationName =
Environment.GetCommandLineArgs()[0]+ ".exe";
#endif
string exePath = System.IO.Path.Combine(
Environment.CurrentDirectory, applicationName);
// Get the configuration file. The file name has
// this format appname.exe.config.
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(exePath);
try
{
// Create the custom section entry
// in <configSections> group and the
// related target section in <configuration>.
if (config.Sections["CustomSection"] == null)
{
ConsoleSection customSection = new ConsoleSection();
customSection.BackgroundColor = "Black";
customSection.ForegroundColor = "White";
config.Sections.Add("CustomSection", customSection);
// Save the configuration file.
customSection.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
Console.WriteLine("Created configuration file: {0}",
config.FilePath);
}
}
catch (ConfigurationErrorsException err)
{
Console.WriteLine("CreateConfigurationFile: {0}", err.ToString());
}
// Display feedback.
Console.WriteLine();
Console.WriteLine("Using OpenExeConfiguration(string).");
// Display the current configuration file path.
Console.WriteLine("Configuration file is: {0}",
config.FilePath);
ConsoleSection sect = config.GetSection("CustomSection") as ConsoleSection;
Console.WriteLine("FG Color: {0}",
sect.ForegroundColor);
Console.WriteLine("BG Color: {0}",
sect.BackgroundColor);
return;
}
和 ConsoleSection 类:
public class ConsoleSection : ConfigurationSection
{
public ConsoleSection()
{
}
[ConfigurationProperty("BackgroundColor", IsRequired=true)]
public string BackgroundColor {
get { return (string)(this["BackgroundColor"]); }
set { this["BackgroundColor"] = value; }
}
[ConfigurationProperty("ForegroundColor", IsRequired = true)]
public string ForegroundColor
{
get { return (string)(this["ForegroundColor"]); }
set { this["ForegroundColor"] = value; }
}
}
我还注意到,在第一次运行期间(当它应该保存东西时),它读取的值很好,所以如果你要保存这段代码并运行它,第一次运行会产生预期的输出。
如果重要,该代码以 .NET Core 3.1 为目标。