У меня есть приложение WinForms, которое развернуто с помощью системы публикации (ClickOnce) Visual Studio 2008. В файле app.config
приложения есть раздел конфигурации, который требуется стороннему компоненту в форме:
<section name="thirdPartySection"
type="System.Configuration.NameValueSectionHandler" />
Раздел, таким образом, отсутствует в appSettings и выглядит так:
<thirdPartySection >
<add key="someKey" value="someValue" />
</thirdPartySection >
Я понимаю, что пары ключ / значение являются NameValueCollection. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу изменить значение либо во время развертывания, либо во время выполнения (либо мне подходит), так что someValue
будет someOtherValue
в зависимости от установленной среды.
В настоящее время я делаю некоторые другие изменения конфигурации во время выполнения, но они находятся в разделе AppSettings
, и, следовательно, легко доступны. Я нашел много ссылок в моем поиске решения, но они, кажется, полагаются на раздел, имеющий собственный класс, а не на коллекцию NameValueCollection, с которой я столкнулся.
Кто-нибудь знает лучший способ изменить эти данные? Изменение времени выполнения с помощью ConfigurationManager.RefreshSection () будет в большей степени соответствовать моему текущему коду, но я открыт для предложений и на этапе установки.
Редактировать: Это работает во время выполнения. Так я обрабатывал старые переопределения конфигурации.
Configuration config = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
config.AppSettings.Settings["Main.ConnectionString"].Value =
PolicyTrackerInfo.ConnectionString;
config.AppSettings.Settings["Main.linq"].Value =
PolicyTrackerInfo.LinqConnectionString;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
Моя попытка сделать то же самое для другого раздела:
string overwriteXml = config.GetSection("thirdPartySection")
.SectionInformation.GetRawXml();
XmlDocument xml = new XmlDocument();
xml.LoadXml(overwriteXml);
XmlNode node = xml.SelectSingleNode("thirdPartySection/add");
node.Attributes["value"].Value = PolicyTrackerInfo.OverwriteString;
Пока все хорошо. Однако я не вижу метода, который позволил бы мне заменить старый XML моими измененными данными. Возможно ли это во время выполнения?
В качестве отступления: я попытался вручную изменить файл app.config.deploy. Это просто дает мне ошибку проверки, так как установщик обнаруживает изменение и отказывается продолжить. Мне действительно нравится автоматическое развертывание, и предыдущее переопределение работало отлично.