Избегайте сведений о версии в configSection в app.config

Я сделал небольшой графический интерфейс для администрирования некоторых параметров в файле app.config. GUI выпускается как часть моего продукта, что позволяет изменять значения в файле app.config, не открывая его в текстовом редакторе.

Свойства реализуются в настраиваемом configSection, что делает его строго типизированным в коде. Моя проблема в том, что когда файл app.config обновляется (когда я сохраняю его из GUI), полное имя моей сборки записывается в configSection следующим образом:

<section name="ConfigurationSettings" type="PerformanceDude.MSBuildShellExtension.Common.ConfigurationSettings, Common, Version=2.2.1.0, Culture=neutral, PublicKeyToken=1ab1b15115e63xxx" />

Когда я обновляю эту сборку до нового номера версии, версия сборки кода GUI больше не соответствует ссылкам сборки в app.config.

Вот как я загружаю настройки:

var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap() { ExeConfigFilename = ConfigFilePath }, ConfigurationUserLevel.None);
var settings = Config.GetSection("ConfigurationSettings") as ConfigurationSettings;

Вот как я сохраняю настройки:

config.Save(ConfigurationSaveMode.Minimal, true);

Я не хочу писать обновление script, изменяя версию каждый раз, когда я обновляю. Кто-нибудь знает отличное решение этой проблемы?

Ответ 1

Я должен был сделать аналогичную вещь раньше. Я закончил загрузку конфигурационного файла как xml, де-сериализации соответствующих разделов в объекты, а затем вернул их в xml. Избегая API конфигурации конфигурации .net таким образом, избегайте проблем с версией.

Другой подход - перенаправить старую версию сборки на новую версию. Если ваша сборка находится в GAC, вы можете использовать файлы политик для этого и развертывать их при развертывании новой версии; то номера версий в конфиге не будут иметь значения.