在运行时保存和重新加载app.config(applicationSettings)

13
我已将应用程序的配置存储在app.config中,通过Visual Studio我在项目属性对话框的设置选项卡上创建了一些应用程序键,然后我将这个键设置为应用程序级别(而不是用户级别)。
Visual Studio会自动生成以下XML文件(app.config):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="AleTest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <AleTest.Properties.Settings>
            <setting name="DatabasePath" serializeAs="String">
                <value>Test.s3db</value>
            </setting>
            <setting name="DatabaseUser" serializeAs="String">
                <value />
            </setting>
            <setting name="DatabasePass" serializeAs="String">
                <value />
            </setting>
        </AleTest.Properties.Settings>
    </applicationSettings>
</configuration>

现在我想在运行时保存和重新加载设置,下面是我的代码,允许将 DatabasePath 的值保存在配置文件中:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

ConfigurationSectionGroup applicationSectionGroup = config.GetSectionGroup("applicationSettings");
ConfigurationSection applicationConfigSection = applicationSectionGroup.Sections["AleTest.Properties.Settings"];
ClientSettingsSection clientSection = (ClientSettingsSection)applicationConfigSection;

//Database Configuration Setting
SettingElement applicationSetting = clientSection.Settings.Get("DatabasePath");
applicationSetting.Value.ValueXml.InnerXml = this.textBoxPath.Text.Trim();

applicationConfigSection.SectionInformation.ForceSave = true;
config.Save();

问题是使用此代码后,新配置不会被应用程序加载,直到我重新启动应用程序;是否有一种方法在运行时重新加载配置设置?

我还想将applicationSettings部分的固定名称值(AleTest.Properties.Settings)替换为变量值,是否存在一个变量可以承担这个值(AleTest.Properties.Settings)?


我有一个不同的问题:使用Configuration对象将内容写入web.config文件中的'applicationSettings'部分。感谢您向我展示如何做到这一点。 :) - Kai Hartmann
4个回答

8

1
我已经尝试了 ConfigurationManager.RefreshSection("applicationSettings"),但是不起作用... 你试过吗? - aleroot
我在不同的项目中已经多次使用过这个。我不确定你在这里可能遇到了什么具体的问题,但我稍后会查看一下,看看是否可以重现。 - Josh
看我的答案。Settings.Default.Reload(); 在我的情况下有效。 - Oleg Savelyev
嗨,正如https://dev59.com/bXI-5IYBdhLWcg3weoJP#4950694中所解释的那样 - 我不得不使用ResetConfigManager hack与RefreshSection("appSettings")相结合。 - Robert Cutajar

7
我进行了一些测试,以下是结果。
对于自动生成的类Settings,调用ConfigurationManager.RefreshSection("applicationSettings");不会应用标记为ApplicationScopedSettingAttribute的成员的修改值,它会将更改应用于通过ConfigurationManager成员进行的未来调用(对于UserScopedSettingAttribute我不确定)。
相反,请调用Settings.Default.Reload();

Settings.Default.Reload(); 不像预期的那样工作,问题仍然存在。 - IulianT

3
您想要实现的目标可以通过创建自定义 ConfigSection 来实现,这样可以使您拥有更多的控制权并能够更改名称。配置管理器有一个刷新节的功能,可以让您重新加载数据。

0
Aleroot的更新值代码运行良好。 尽管Properties.Settings是只写的(没有设置)。
为了刷新,这对我有用: ConfigurationManager.RefreshSection("applicationSettings");
但我使用这个来访问参数: string test = Properties.Settings.Default.MyString; MessageBox.Show("Paramètres/Settings MyString = " + test);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接