Я записал маленькую утилиту, которая позволяет мне изменять простой AppSetting для файла другого приложения App.config и затем сохранять изменения:
//save a backup copy first.
var cfg = ConfigurationManager.OpenExeConfiguration(pathToExeFile);
cfg.SaveAs(cfg.FilePath + "." + DateTime.Now.ToFileTime() + ".bak");
//reopen the original config again and update it.
cfg = ConfigurationManager.OpenExeConfiguration(pathToExeFile);
var setting = cfg.AppSettings.Settings[keyName];
setting.Value = newValue;
//save the changed configuration.
cfg.Save(ConfigurationSaveMode.Full);
Это работает хорошо, за исключением одного побочного эффекта. Недавно сохраненный .config файл теряет все исходные XML-комментарии, но только в области AppSettings. Действительно ли возможно для сохранения XML-комментариев от исходной области AppSettings конфигурационного файла?
Вот pastebin полного источника, если требуется быстро скомпилировать и выполнить его.
Я прыгнул в Reflector.Net и посмотрел на декомпилированный источник для этого класса. Короткий ответ - нет, комментарии не сохранились. Способ написания класса от Microsoft заключается в генерации XML-документа из свойств на конфигурационном классе. Так как комментарии не появляются в классе конфигурации, они не возвращают его обратно в XML.
А хуже всего то, что Microsoft опечатала все эти классы, так что вы не можете вывести новый класс и вставить свою собственную реализацию. Единственный вариант - это перенести комментарии за пределы раздела AppSettings или вместо них использовать XmlDocument
или XDocument
классы для разбора конфигурационных файлов.
Извините. Это крайний случай, который Microsoft просто не планировала.
Если комментарии критичны, возможно, единственный вариант - это прочитать и сохранить файл вручную (с помощью XmlDocument
или нового Linq-связанного API). Если же эти комментарии не критичны, я либо отпущу их, либо, возможно, рассмотрю возможность их встраивания в качестве (пусть и избыточных) элементов данных.