visual studio sharp generar fuente etiquetas documentar documentacion crear como codigo clases c# xml configuration-files xml-comments configurationmanager

c# - sharp - generar documentacion visual studio 2017



¿ConfigurationManager puede retener los comentarios XML en Guardar()? (3)

Aquí hay una función de ejemplo que podría usar para guardar los comentarios. Le permite editar un par clave / valor a la vez. También agregué algunas cosas para formatear el archivo de manera agradable según la forma en que comúnmente uso los archivos (Podría eliminarlos fácilmente si lo desea). Espero que esto pueda ayudar a alguien más en el futuro.

public static bool setConfigValue(Configuration config, string key, string val, out string errorMsg) { try { errorMsg = null; string filename = config.FilePath; //Load the config file as an XDocument XDocument document = XDocument.Load(filename, LoadOptions.PreserveWhitespace); if(document.Root == null) { errorMsg = "Document was null for XDocument load."; return false; } XElement appSettings = document.Root.Element("appSettings"); if(appSettings == null) { appSettings = new XElement("appSettings"); document.Root.Add(appSettings); } XElement appSetting = appSettings.Elements("add").FirstOrDefault(x => x.Attribute("key").Value == key); if (appSetting == null) { //Create the new appSetting appSettings.Add(new XElement("add", new XAttribute("key", key), new XAttribute("value", val))); } else { //Update the current appSetting appSetting.Attribute("value").Value = val; } //Format the appSetting section XNode lastElement = null; foreach(var elm in appSettings.DescendantNodes()) { if(elm.NodeType == System.Xml.XmlNodeType.Text) { if(lastElement?.NodeType == System.Xml.XmlNodeType.Element && elm.NextNode?.NodeType == System.Xml.XmlNodeType.Comment) { //Any time the last node was an element and the next is a comment add two new lines. ((XText)elm).Value = "/n/n/t/t"; } else { ((XText)elm).Value = "/n/t/t"; } } lastElement = elm; } //Make sure the end tag for appSettings is on a new line. var lastNode = appSettings.DescendantNodes().Last(); if (lastNode.NodeType == System.Xml.XmlNodeType.Text) { ((XText)lastNode).Value = "/n/t"; } else { appSettings.Add(new XText("/n/t")); } //Save the changes to the config file. document.Save(filename, SaveOptions.DisableFormatting); return true; } catch (Exception ex) { errorMsg = "There was an exception while trying to update the config value for ''" + key + "'' with value ''" + val + "'' : " + ex.ToString(); return false; } }

He escrito una pequeña utilidad que me permite cambiar un AppSetting simple para el archivo App.config de otra aplicación y luego guardar los cambios:

//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);

Esto funciona bien, excepto por un efecto secundario. El archivo .config recién guardado pierde todos los comentarios XML originales, pero solo dentro del área de configuración de aplicaciones. ¿Es posible retener los comentarios XML del área de configuración original del archivo de configuración?

Aquí hay un pastebin de la fuente completa si desea compilarlo y ejecutarlo rápidamente.


Salté a Reflector.Net y miré la fuente descompilada para esta clase. La respuesta corta es no, no retendrá los comentarios. La forma en que Microsoft escribió la clase es generar un documento XML a partir de las propiedades en la clase de configuración. Como los comentarios no aparecen en la clase de configuración, no vuelven al XML.

Y lo que empeora esto es que Microsoft selló todas estas clases para que no pueda derivar una nueva clase e insertar su propia implementación. Su única opción es mover los comentarios fuera de la sección XmlDocument o XDocument clases XmlDocument o XDocument para analizar los archivos de configuración en su lugar.

Lo siento. Este es un caso de ventaja que Microsoft simplemente no planeó.


Si los comentarios son críticos, es posible que su única opción sea leer y guardar el archivo manualmente (a través de XmlDocument o la nueva API relacionada con Linq). Sin embargo, si esos comentarios no son críticos, los dejaría pasar o consideraría la posibilidad de incluirlos como elementos de datos (aunque redundantes).