I have an XML file with these settings
<?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="UpdateReportService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <UpdateReportService.Properties.Settings> <setting name="Path" serializeAs="String"> <value>C:\1</value> </setting> <setting name="Branch" serializeAs="String"> <value>200</value> </setting> <setting name="b204" serializeAs="String"> <value>192.168.1.55</value> </setting> <setting name="b200" serializeAs="String"> <value>192.168.0.83</value> </setting> <setting name="Hour" serializeAs="String"> <value>11</value> </setting> </UpdateReportService.Properties.Settings> </applicationSettings> </configuration>
And I would like to change some values ββto the values ββentered by the user during the setup program.
I find an example on VB and try to convert it to C #:
namespace InstallConfigurator { [RunInstaller(true)] public class SettingsClass : Installer { public override void Install(System.Collections.IDictionary stateSaver) { Configuration config = ConfigurationManager.OpenExeConfiguration(Context.Parameters["TARGETDIR"].ToString() + "UpdateReportService.exe"); ClientSettingsSection applicationSettingsSection = (ClientSettingsSection)config.SectionGroups["applicationSettings"].Sections["UpdateReportService.Properties.Settings"]; SettingElement Elem = applicationSettingsSection.Settings["Branch"]; applicationSettingsSection.Settings.Remove(Elem); Elem.Value.ValueXml.InnerXml = "30000"; applicationSettingsSection.Settings.Add(Elem); config.Save(ConfigurationSaveMode.Full); } } }
But get the error βunavailable due to protection levelβ in this place:
SettingElement Elem = applicationSettingsSection.Settings["Branch"];
So, is it possible in C # to access a section in App.config and change it.
Upd. 2012.02.10
I solved the problem this way:
namespace InstallConfigurator { [RunInstaller(true)] public class SettingsClass : Installer { public override void Install(System.Collections.IDictionary stateSaver) { string xml = Context.Parameters["TARGETDIR"].ToString() + "UpdateReportService.exe.config"; XmlDocument document = new XmlDocument(); document.Load(xml); XPathNavigator navigator = document.CreateNavigator(); XmlNamespaceManager ns = new XmlNamespaceManager(navigator.NameTable); foreach (XPathNavigator nav in navigator.Select(@"/configuration/applicationSettings/UpdateReportService.Properties.Settings/setting[@name='Branch']/value")) { nav.SetValue(Context.Parameters["BRANCH"].ToString()); } foreach (XPathNavigator nav in navigator.Select(@"/configuration/applicationSettings/UpdateReportService.Properties.Settings/setting[@name='Path']/value")) { nav.SetValue(Context.Parameters["PATH"].ToString()); } document.Save(xml); } } }
source share