【问题标题】:ConfigurationManager Not saving values as expectedConfigurationManager 未按预期保存值
【发布时间】:2013-06-12 03:08:54
【问题描述】:

我的程序有如下配置文件

<appSettings>
    <add key="ShowDebugWindow" value="false"/>
    <add key="AppDataSubFolder" value="DLI\Keymon"/>
    <add key="KeymonSettingsFile" value="Keymon.xml"/>
    <add key="KeymonSettingsFileExtension" value="XML"/>
</appSettings>

经过一番挖掘,我发现了如何 A) 检查该密钥是否存在 B) 如果需要,添加一个新密钥。由于我的程序在 Program Files 中,我发现为了避免将配置文件保存到虚拟存储中,我必须让我的程序以管理员身份运行。这是不允许的,所以我决定制作一个控制台项目来为我解决这个问题。很简单。

所以我这样做了

    public static int Main(string[] args)
    {
        FixConfigFile();
        return 0;
    }
    private static void FixConfigFile()
    {//warning if the program is writing to a protect area, the config file might be redirected to virtual store
        UpdateSettingIfMissing("ShowDebugWindow", "false");
        UpdateSettingIfMissing("AppDataSubFolder", "DLI\\Keymon");
        UpdateSettingIfMissing("KeymonSettingsFile", "Keymon.xml");
        UpdateSettingIfMissing("KeymonSettingsFileExtension", "XML");
        UpdateSettingIfMissing("LeftButton1", "");
        UpdateSettingIfMissing("RightButton1", "");
        UpdateSettingIfMissing("FunctionButton1", "");
        UpdateSettingIfMissing("FunctionButton2", "");
        UpdateSettingIfMissing("FunctionButton3", "");
        UpdateSettingIfMissing("FunctionButton4", "");
        UpdateSettingIfMissing("FunctionButton5", "");
        UpdateSettingIfMissing("FunctionButton6", "");
    }
    private static void UpdateSettingIfMissing(string key, string defaultValue)
    {
        var setting = ConfigurationManager.AppSettings[key];
        if (setting == null)
        {
            UpdateSetting(key, defaultValue);
        }
    }
    private static void UpdateSetting(string key, string value)
    {
        Configuration configuration = ConfigurationManager.OpenExeConfiguration(@"Keymon.exe");
        configuration.AppSettings.Settings.Add(key, value);
        configuration.Save(ConfigurationSaveMode.Minimal);
    }

配置文件如下所示

    <add key="ShowDebugWindow" value="false,false" />
    <add key="AppDataSubFolder" value="DLI\Keymon" />
    <add key="KeymonSettingsFile" value="Keymon.xml,Keymon.xml" />
    <add key="KeymonSettingsFileExtension" value="XML,XML" />
    <add key="LeftButton1" value="" />
    <add key="RightButton1" value="" />
    <add key="FunctionButton1" value="" />
    <add key="FunctionButton2" value="" />
    <add key="FunctionButton3" value="" />
    <add key="FunctionButton4" value="" />
    <add key="FunctionButton5" value="" />
    <add key="FunctionButton6" value="" />

请注意,该值现在有“2”个逗号分隔的值...为什么???因此,作为测试,我删除了所有密钥,并运行了我的程序。现在这些值都是正确的,但是现在 keymon 崩溃了,因为没有加载键/值。这很奇怪,因为我在 keymon 中运行这个..

        if (RunFixer)
        {
            System.Diagnostics.Process.Start("KeymonConfigFixer.exe");
            ConfigurationManager.RefreshSection("appSettings");
        }

所以我不明白。我错过了什么?为什么要这样做?帮助

【问题讨论】:

  • 是因为在UpdateSettingIfMissing 中您使用ConfigurationManager.AppSettings[key] 打开当前应用程序(您的控制台应用程序)的应用程序设置,而在UpdateSetting 中您打开Keymon.exe 的设置
  • @MattBurland 很棒的收获!谢谢你。等我到办公室试试看。
  • @MattBurland 你应该把它作为答案,这样我才能接受。我只是将代码放入,它按预期执行。非常感谢你抓住它。修复是这样的。 ` 配置配置 = ConfigurationManager.OpenExeConfiguration(@"Keymon.exe"); var setting = configuration.AppSettings.Settings[key];`
  • 完成。很高兴有帮助。

标签: c# configurationmanager


【解决方案1】:

这是因为在UpdateSettingIfMissing 中您使用ConfigurationManager.AppSettings[key] 打开当前应用程序(您的控制台应用程序)的应用程序设置,而在UpdateSetting 中您打开 Keymon.exe 的设置

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多