AppSettings und ConnectionStrings sind beide Eigenschaften, die direkt im ConfigurationManager verfügbar sind.
jedoch application und Usersettings, die den bekannten Settings.settings entspricht Sie in den VS-Einstellungen Designer bearbeiten können, ist nicht so leicht zu bekommen. AppSettings ist nicht das gleiche wie applicationSettings die in einem ganz anderen Abschnitt der Konfigurationsdatei im Einsatz ist.
Sie müssen den Bergbau Ansatz oben oder eine Variante verwenden bei application und Usersettings zu bekommen. Außerdem werden die applicationSettings nur beim nächsten Start der Anwendung aktualisiert, wenn Sie sogar in der Lage sind, sie überhaupt zur Laufzeit zu schreiben.
Zum Beispiel (von anderswo abgekupfert - danke):
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;
}
und für ein anderes Beispiel (adaoted von vielen Beispielen - vielen Dank für die Welt):
///<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"));
}
Dann Sie leider müssen sich weiterhin mit den SettingElement-Objekten beschäftigen, die sich in den Einstellungen in diesen Abschnitten befinden. Jeder muss für den Eigenschaftstyp deserialisiert werden, es sei denn, es handelt sich um eine Zeichenfolge, z. für einen application SettingElement (eine, die nicht zur Laufzeit dynamisch aktualisiert werden kann):
(exerciser)
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);
}
für eine Zeichenfolge Eigenschaft es ist einfacher (Dieses Beispiel ist im Wesentlichen mit dem ersten über redundant):
var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml
.InnerText
Alle diese Beispiele fiedled mit ApplicationSettings. Der gleiche Ansatz kann mit userSettings mit dem Hinzufügen von möglicherweise einigen Speichermethoden usw. arbeiten, und Sie müssen (mehr oder weniger) verfolgen, welche der vielen Konfigurationsdateien tatsächlich im Spiel sind - Main, Roaming oder Local .
Warum mache ich das? Da zwei verwandte Anwendungen und eine gemeinsame Klassenbibliothek (oder Bibliotheken) dieselben Einstellungen verwenden müssen, die einer der Anwendungen gehören, in denen die Einstellungen visuell verwaltet werden. Hat jemand das besser gelöst?
Danke.
OK auf die Notwendigkeit, so viel zu erreichen. Ich kann das String-Array auf diese Weise lesen. Die Zeichenfolgen stammen jedoch aus dem Standard, der in die Assembly kompiliert wurde. Ich muss Strings in dieser Sammlung hinzufügen, entfernen und ändern können, nachdem die Assembly bereitgestellt wurde. Die .Properties.Settings.Default nimmt keine Änderungen an der .config-Datei auf. Hatte das gleiche Problem mit den Verbindungszeichenfolgen, bis ich den ConfigurationManager durchging. –
Sie müssen wahrscheinlich auf die Methode des ConfigurationManagers zugreifen: ConfigurationManager.GetSection ("applicationSettings"); , die das Objekt, für das Sie analysieren möchten, zurückgeben soll – jkelley
ConfigurationManager.GetSection ("applicationSettings") gibt null zurück –