所以,长话短说,我正在开发一个应用程序,它将使用一些可能在运行时通过应用程序本身更改的配置信息。出于我的目的,我想到了使用Settings
类。
问题是,在应用程序的不同运行之间不会保留信息:
运行1)
Console.WriteLine(Settings.Default["User"]); //prints "Default user"
Settings.Default["User"] = "abc";
Console.WriteLine(Settings.Default["User"]); //prints "abc"
运行2)
Console.WriteLine(Settings.Default["User"]); //prints "Default user"
Settings.Default["User"] = "abc";
Console.WriteLine(Settings.Default["User"]); //prints "abc"
(两者都打印完全相同的输出)
两次运行都显示相同的第一个打印“默认用户”,虽然在第二次运行时我想得到“abc”,表明信息不是在不同的应用程序执行之间持久存在。
我承认这必须与Visual Studio处理.config文件的方式有关,但即便如此,我想知道如何纠正这种(讨厌的)行为?
答案 0 :(得分:7)
默认情况下,不直接复制App.config,而是将其内容放在输出文件夹中的<assembly-name>.config
文件中。复制设置不适用于此操作。
通常,应用程序更改自己的app.config不是一个好习惯。如果您正在开发可能由同一台PC上的多个用户使用的应用程序,那么请use Settings。这样每个用户都可以拥有自己的设置。
对于服务和系统范围的设置,请考虑使用其他存储,例如单独的配置文件,注册表或数据库。
关于保存设置的修改
使用设置类时,应调用Save()将其写入文件,否则应用程序关闭时将丢弃设置更改。如果您经常在开发期间终止您的应用程序,并且它没有到达它的结束代码(通常会调用Save()),那么您有几个选项:
Settings.Default.Save()
等表达式,并在每次要保存时刷新它。答案 1 :(得分:2)
此代码的User属性设置为User
范围:
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ConsoleApplication4.Settings1.Default["User"]); //prints "DefaultUser"
ConsoleApplication4.Settings1.Default["User"] = "abc";
Console.WriteLine(ConsoleApplication4.Settings1.Default["User"]);
ConsoleApplication4.Settings1.Default.Save();
Console.Read();
}
}
}
将设置保存到不明显的位置:
C:\ Users \用户名\应用程序数据\本地\ ConsoleApplication4 \ ConsoleApplication4.exe_Url_acauylh2btl2j4ed0ilz0mujq5aomfmu \ 1.0.0.0
因此,即使在 app.config 中,您仍会在多次运行应用程序后看到“默认用户”:
<userSettings>
<ConsoleApplication4.Settings1>
<setting name="User" serializeAs="String">
<value>Default User</value>
</setting>
</ConsoleApplication4.Settings1>
</userSettings>
在 User.Config 中,它将是用户的最后设置值。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<ConsoleApplication4.Settings1>
<setting name="User" serializeAs="String">
<value>abc</value>
</setting>
</ConsoleApplication4.Settings1>
</userSettings>
</configuration>
当我第一次运行此代码时,输出为“默认用户”,“abc”,第二次运行输出为“abc”“abc”
也许只是你遗失的Save();
。
如果您的App.Config文件与程序文件下的程序一起存储,普通用户(非管理员,非高级用户)将无法写入该文件。 < / p>
您必须编写从PreBuild事件触发的exe或脚本,该事件将User.Config设置写回settings1.settings文件,然后内置到App.Config中。
我不认为你想这样做,因为User.config会覆盖App.Config,第二次调试代码时你会得到“abc”“abc”。
我非常确信只有Save()
缺失了。或者应用程序范围设置应该是只读的。
答案 2 :(得分:2)
以下是我用来将某些内容保存回app.config文件的内容。
//write the last run time to config
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.AppSettings.Settings["LastRunTime"] == null)
{
config.AppSettings.Settings.Add("LastRunTime", DateTime.UtcNow.ToString());
}
else
{
config.AppSettings.Settings["LastRunTime"].Value = DateTime.UtcNow.ToString();
}
config.Save();
希望这有帮助。
答案 3 :(得分:1)
我不确定这与您的方法有什么不同,但我使用设置文件解决了这个问题。
首先,从项目的“属性”菜单中创建“设置”文件。右键单击解决方案资源管理器中的项目,然后选择“属性”。转到“设置”选项卡并创建设置文件。创建文件后,您应该看到一个数据网格,您可以在其中输入名称/类型/范围/值。设置你想在这里使用的所有变量(我不确定你是否可以在运行时创建更多的变量,但我不这么认为)。
现在,在代码中,您可以使用属性类,该类将位于项目的默认命名空间中。
阅读设定:
Properties.Settings.Default.SrcDir;
并保存设置:
Properties.Settings.Default.SrcDir = src;
Properties.Settings.Default.Save();
答案 4 :(得分:-1)
也许您可以使用文件系统在2个文件之间创建符号链接,以便它实际编辑源文件中的文件。但是我想不出编译器不会覆盖配置文件的快速解决方案(从而删除链接)。
至少这种方法不需要您编写变通方法。它也不会影响您想要保存设置的方式(例如从默认更改为用户范围)。因此,只有在开发时才有效。