Reputation: 517
I have XML-file with settings 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="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'd like to change some values to values typed by user during install program.
I find example on VB and try 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 error "inaccessible due to its protection level" at this place:
SettingElement Elem = applicationSettingsSection.Settings["Branch"];
So, is it possible on c# to access to section in App.config and to change it.
Upd. 2012.02.10
i've solved 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);
}
}
}
Upvotes: 6
Views: 9520
Reputation: 40756
In a similar project, I'm doing it in a slightly different way:
{Branch}
".30000
").This runs pretty smooth in our applications.
Upvotes: 2