AppSettings y ConnectionStrings son propiedades directamente disponibles en el ConfigurationManager.
Sin embargo, applicationSettings y usersettings, que corresponden a los familiares Settings.settings se pueden editar en el diseñador de configuración VS, no son tan fáciles de alcanzar. AppSettings es NOT igual que applicationSettings que se encuentra en una sección completamente diferente del archivo de configuración en uso.
debe utilizar el enfoque de la minería por encima o por una variante para llegar a applicationSettings y usersettings. Además, el applicationSettings solo se actualizará la próxima vez que inicie la aplicación, incluso si puede escribir en el tiempo de ejecución.
Por ejemplo (cribbed de otro lugar - gracias):
public static string ReadSetting(string sectionGroupName, string sectionName, string settingName, Configuration config = null)
{
if (config == null)
config = SharedConfigSettings;
// Get sectionGroup
var sectionGroup =
config.GetSectionGroup(sectionGroupName);
// Get section
var section =
(ClientSettingsSection)sectionGroup.Sections.Get(sectionName);
// Get setting
var setting = section.Settings.Get(settingName);
// Read setting value
return setting.Value.ValueXml.InnerText;
}
y para otro ejemplo (adaoted de muchos ejemplos - gracias al mundo):
///<summary>
/// return the applicationSettings section
///</summary>
///<returns></returns>
public static ClientSettingsSection GetSettingsSection(ConfigurationSectionGroup group, string clientSectionName)
{
return (ClientSettingsSection)group.Sections[clientSectionName];
}
///<summary>
/// return the section settings collection
///</summary>
///<returns></returns>
public static System.Configuration.SettingElementCollection GetSettingsCollection(ClientSettingsSection section)
{
return section.Settings;
}
///<summary>
/// return the connectionStrings section collection
///</summary>
///<returns></returns>
public static System.Configuration.SettingElementCollection ConnectionStringsCollection()
{
return ((ClientSettingsSection)SharedConfigSettings.GetSection("connectionStrings")).Settings;
}
///<summary>
/// A collection of all the UserSettings in a SettingElementCollection
///</summary>
///<returns></returns>
public static SettingElementCollection UserSettings()
{
return
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"userSettings"),
@"MyAssembly.Properties.Settings"));
}
///<summary>
/// A collection of all the ApplicationSettings in a SettingElementCollection
///</summary>
///<returns></returns>
public static SettingElementCollection ApplicationSettings()
{
return
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"),
@"MyAssembly.Properties.Settings"));
}
Entonces, por desgracia, todavía tiene que tratar con los objetos SettingElement que están en la colección de configuraciones en estas secciones. Cada uno tiene que deserializarse a la propiedad Tipo a menos que sea una cadena, p. para una SettingElement applicationSettings (uno que no se puede actualizar dinámicamente en tiempo de ejecución):
(ejercitador)
var y = GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), @"MyAssembly.Properties.Settings");
var c = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "WellKnownDirectories").Value).ValueXml
.InnerXml; // the setting as Xml
var xs = new XmlSerializer(typeof(string[]));
var strings = (string[])xs.Deserialize(new XmlTextReader(c, XmlNodeType.Element, null));
foreach (string s in strings)
{
Console.WriteLine(s);
}
Para una propiedad de cadena es más fácil (este ejemplo es esencialmente redundante con el primero más arriba):
var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml
.InnerText
Todos estos ejemplos tocaron con applicationSettings. El mismo enfoque puede funcionar con userSettings con la adición de probablemente algunos métodos de guardado, y así sucesivamente, y necesita hacer un seguimiento (más o menos) de cuáles de los muchos archivos de configuración están realmente en funcionamiento: principal, roaming o local. .
¿Por qué estoy haciendo esto? Debido a que dos aplicaciones relacionadas y una biblioteca de clases común (o bibliotecas) necesitan usar la misma configuración que posee una de las aplicaciones donde la configuración se administra visualmente. ¿Alguien ha resuelto esto de una mejor manera?
Gracias.
OK. Puedo leer la matriz de cadenas de esa manera. Pero, las cadenas provienen del valor predeterminado compilado en el conjunto. Necesito poder agregar, quitar y cambiar cadenas en esa colección después de desplegar el ensamblado. The .Properties.Settings.Default no recupera las ediciones del archivo .config. Tuve el mismo problema con las cadenas de conexión hasta que comencé a utilizar el ConfigurationManager. –
Probablemente necesite acceder al método de ConfigurationManager: ConfigurationManager.GetSection ("applicationSettings"); que debería devolver el objeto que está buscando analizar – jkelley
ConfigurationManager.GetSection ("applicationSettings") devuelve nulo –