Search code examples
c#xmlwpfconfigurationmanager

App Settings not showing up after loading a app.config file with configuration manager


Ok, I have a config file that looks like this:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MDCHartfordMVVM.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <connectionStrings>
        <add name="MDCHartfordMVVM.Properties.Settings.DBConnection"
            connectionString="Data Source=.\sqlexpress;Initial Catalog=TPS;Persist Security Info=True;User ID=sa;Password=service#123"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <applicationSettings>
        <MDCHartfordMVVM.Properties.Settings>
            <setting name="OPCServer" serializeAs="String">
                <value>Kepware.KepserverEX.v5</value>
            </setting>
            <setting name="OPCGroup" serializeAs="String">
                <value>Group1</value>
            </setting>
            <setting name="OPCUpdateRate" serializeAs="String">
                <value>5000</value>
            </setting>
            <setting name="OPCDeadband" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="HeartBeat" serializeAs="String">
                <value>TPS.KSS.HeartBeat</value>
            </setting>
            <setting name="TLICNumber" serializeAs="String">
                <value>TPS.KSS.TLICNumber</value>
            </setting>
            <setting name="TruckIDNumber" serializeAs="String">
                <value>TPS.KSS.TruckIDNumber</value>
            </setting>
            <setting name="TruckCompany" serializeAs="String">
                <value>TPS.KSS.TruckCompany</value>
            </setting>
            <setting name="TruckWidth" serializeAs="String">
                <value>TPS.KSS.TruckWidth</value>
            </setting>
            <setting name="TruckLength" serializeAs="String">
                <value>TPS.KSS.TruckLength</value>
            </setting>
            <setting name="TruckDepth" serializeAs="String">
                <value>TPS.KSS.TruckDepth</value>
            </setting>
            <setting name="TruckVolume" serializeAs="String">
                <value>TPS.KSS.TruckVolume</value>
            </setting>
            <setting name="TruckTare" serializeAs="String">
                <value>TPS.KSS.TruckTare</value>
            </setting>
            <setting name="TruckMaxGross" serializeAs="String">
                <value>TPS.KSS.TruckMaxGross</value>
            </setting>
            <setting name="TruckType" serializeAs="String">
                <value>TPS.KSS.TruckType</value>
            </setting>
            <setting name="Mt_Pos1_Lev1" serializeAs="String">
                <value>TPS.KSS.Mt_Pos1_Lev1</value>
            </setting>
            <setting name="Mt_Pos1_Lev2" serializeAs="String">
                <value>TPS.KSS.Mt_Pos1_Lev2</value>
            </setting>
            <setting name="Mt_Pos1_Lev3" serializeAs="String">
                <value>TPS.KSS.Mt_Pos1_Lev3</value>
            </setting>
            <setting name="Mt_Pos2_Lev1" serializeAs="String">
                <value>TPS.KSS.Mt_Pos2_Lev1</value>
            </setting>
            <setting name="Mt_Pos2_Lev2" serializeAs="String">
                <value>TPS.KSS.Mt_Pos2_Lev2</value>
            </setting>
            <setting name="Mt_Pos2_Lev3" serializeAs="String">
                <value>TPS.KSS.Mt_Pos2_Lev3</value>
            </setting>
            <setting name="Mt_Pos3_Lev1" serializeAs="String">
                <value>TPS.KSS.Mt_Pos3_Lev1</value>
            </setting>
            <setting name="Mt_Pos3_Lev2" serializeAs="String">
                <value>TPS.KSS.Mt_Pos3_Lev2</value>
            </setting>
            <setting name="Mt_Pos3_Lev3" serializeAs="String">
                <value>TPS.KSS.Mt_Pos3_Lev3</value>
            </setting>
            <setting name="Fl_Pos1_Lev1" serializeAs="String">
                <value>TPS.KSS.Fl_Pos1_Lev1</value>
            </setting>
            <setting name="Fl_Pos1_Lev2" serializeAs="String">
                <value>TPS.KSS.Fl_Pos1_Lev2</value>
            </setting>
            <setting name="Fl_Pos1_Lev3" serializeAs="String">
                <value>TPS.KSS.Fl_Pos1_Lev3</value>
            </setting>
            <setting name="Fl_Pos2_Lev1" serializeAs="String">
                <value>TPS.KSS.Fl_Pos2_Lev1</value>
            </setting>
            <setting name="Fl_Pos2_Lev2" serializeAs="String">
                <value>TPS.KSS.Fl_Pos2_Lev2</value>
            </setting>
            <setting name="Fl_Pos2_Lev3" serializeAs="String">
                <value>TPS.KSS.Fl_Pos2_Lev3</value>
            </setting>
            <setting name="Fl_Pos3_Lev1" serializeAs="String">
                <value>TPS.KSS.Fl_Pos3_Lev1</value>
            </setting>
            <setting name="Fl_Pos3_Lev2" serializeAs="String">
                <value>TPS.KSS.Fl_Pos3_Lev2</value>
            </setting>
            <setting name="Fl_Pos3_Lev3" serializeAs="String">
                <value>TPS.KSS.Fl_Pos3_Lev3</value>
            </setting>
            <setting name="TruckLoadPermissive" serializeAs="String">
                <value>TPS.KSS.TrkLoadPermissive</value>
            </setting>
            <setting name="TruckPositionTarget" serializeAs="String">
                <value>TPS.KSS.TrkPositionTarget</value>
            </setting>
            <setting name="TruckLoadPermissivePlcAsh" serializeAs="String">
                <value>TPS.KSS.TrkLoadPermissivePlcAsh</value>
            </setting>
            <setting name="LoadComplete_PlcAsh" serializeAs="String">
                <value>TPS.KSS.LoadComplete_PlcAsh</value>
            </setting>
            <setting name="TruckPresent" serializeAs="String">
                <value>TPS.KSS.TrkPresent</value>
            </setting>
            <setting name="TruckLoading" serializeAs="String">
                <value>TPS.KSS.TruckLoading</value>
            </setting>
            <setting name="TruckAmountLoaded" serializeAs="String">
                <value>TPS.KSS.TrkAmountLoaded</value>
            </setting>
            <setting name="PEPos1_1" serializeAs="String">
                <value>TPS.KSS.PEPos1_1</value>
            </setting>
            <setting name="PEPos2_1" serializeAs="String">
                <value>TPS.KSS.PEPos2_1</value>
            </setting>
            <setting name="PEPos3_1" serializeAs="String">
                <value>TPS.KSS.PEPos3_1</value>
            </setting>
            <setting name="Cur_Chute1_Lev" serializeAs="String">
                <value>TPS.KSS.Cur_Chute1_Lev</value>
            </setting>
            <setting name="Cur_Chute2_Lev" serializeAs="String">
                <value>TPS.KSS.Cur_Chute2_Lev</value>
            </setting>
            <setting name="Cur_Chute3_Lev" serializeAs="String">
                <value>TPS.KSS.Cur_Chute3_Lev</value>
            </setting>
            <setting name="PEPos1_2" serializeAs="String">
                <value>TPS.KSS.PEPos1_2</value>
            </setting>
            <setting name="PEPos2_2" serializeAs="String">
                <value>TPS.KSS.PEPos2_2</value>
            </setting>
            <setting name="PEPos3_2" serializeAs="String">
                <value>TPS.KSS.PEPos3_2</value>
            </setting>
            <setting name="ExitDoor" serializeAs="String">
                <value>TPS.KSS.ExitDoor</value>
            </setting>
            <setting name="EntryDoor" serializeAs="String">
                <value>TPS.KSS.EntryDoor</value>
            </setting>
            <setting name="PEExitDoor" serializeAs="String">
                <value>TPS.KSS.PEExitDoor</value>
            </setting>
            <setting name="PEEntryDoor" serializeAs="String">
                <value>TPS.KSS.PEEntryDoor</value>
            </setting>
            <setting name="PEShortTruck" serializeAs="String">
                <value>TPS.KSS.PEShortTruck</value>
            </setting>
        </MDCHartfordMVVM.Properties.Settings>
    </applicationSettings>
</configuration>

I want to create another application that can load and modify this file. I open the file by using:

config = ConfigurationManager.OpenExeConfiguration(filepath);

where config is a Configuration object and filepath is the filepath to the configuration file I wish to modify.

This seems to work, however if I set a breakpoint and look at the code after config has been assigned to there are no settings in the appSettings section.

Anyone have any idea why this is so?


Solution

  • I took your config file and wrote it to my temp folder as test.config. You can change the settings you want using the following:

    var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap() { ExeConfigFilename = @"c:\temp\test.config" }, ConfigurationUserLevel.None);
    var clientSettingsSection = (ClientSettingsSection)config.GetSection("applicationSettings/MDCHartfordMVVM.Properties.Settings");
    
    clientSettingsSection.Settings.Get("EntryDoor").Value.ValueXml.ChildNodes[0].Value = "NewValue";
    
    config.SaveAs(@"c:\\temp\\configuration.config",ConfigurationSaveMode.Modified, true);
    

    There are some points of interest. I used OpenMappedExeConfiguration to get the section using "applicationSettings/MDCHartfordMVVM.Properties.Settings". This will get a ClientSettingsSection in your case. Using this ClientSettingsSection we have access to the settings defined in the list.

    We can change a setting by changing the underlying xml. I'm sure there is another way of doing this but i didn't care to look into it further.

    lastly i save the settings using ConfigurationSaveMode.Modified and true arguments. This way i could see the changed value within the new config file.

    But some default empty elements are added using this as well. Perhaps someone knows another way of doing it. This is what i could figure out.