У меня есть приложение WinForms, которое развертывается с использованием системы публикации Visual Studio 2008 (ClickOnce). В app.config
файл приложения У меня есть раздел конфигурации, который требуется компонентом третьей стороной, которая имеет вид:Изменение конфигурационных разделов в App.config во время выполнения или времени установки
<section name="thirdPartySection"
type="System.Configuration.NameValueSectionHandler" />
раздел является, таким образом, не в AppSettings и выглядит как:
<thirdPartySection >
<add key="someKey" value="someValue" />
</thirdPartySection >
I что пары ключ/значение являются 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 вручную. Это просто дает мне ошибку проверки, так как модификация обнаружена установщиком, и она отказывается продолжать. Мне очень нравится автоматическое развертывание, и предыдущее переопределение работало отлично.
Я пробовал использовать «как NameValueConfigurationCollection», но мне сказали, что он не может преобразовать раздел в такую коллекцию. Я видел много сообщений, рекомендующих этот подход: есть ли что-то, что нужно зарегистрировать или иным образом настроить для использования? Он выглядит простой методикой, поэтому я считаю, что это очень полезно (и ваш подход к тестированию для конфигурации, поэтому он выполняется только один раз, вероятно, это то, что я должен был сделать, но перезапись выполнялась, и поэтому она осталась там). – Godeke
System.Configuration должно быть все, что вам нужно в качестве ссылки. Проблема может заключаться в том, что сторонняя секция не выводится из NameValueConfigurationCollection. В строке, где вы получите раздел, можете ли вы проверить его в отладчике, чтобы узнать, какой он тип? – Jacob
Я принял ваш ответ, чтобы получить награду. Если я не пытаюсь использовать этот раздел, это просто «ConfigurationSection», как и ожидалось. Если я отлаживаю это System.Config.DefaultSection (несмотря на форматирование данных в разделе, соответствующем разделу NameValue). – Godeke