AppSettings i ConnectionStrings są właściwościami dostępnymi bezpośrednio w menedżerze konfiguracji ConfigurationManager.
Jednak applicationSettings i userSettings, które odpowiadają znanych Settings.settings można edytować w VS ustawień projektanta, nie jest tak łatwo dostać się na. AppSettings to NOT takie samo, jak applicationSettings, które znajduje się w zupełnie innej sekcji używanego pliku konfiguracyjnego.
Należy stosować metodę górniczą powyżej lub wariant dostać na applicationSettings i userSettings. Ponadto, aplikacja zaktualizuje się tylko następnym razem, gdy uruchomisz aplikację, nawet jeśli będziesz w stanie w ogóle do nich pisać w czasie wykonywania.
Na przykład (żłobienia skądinąd - dziękuję):
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;
}
a dla innego przykładu (adaoted z wielu przykładów - dziękuję światu):
///<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"));
}
Potem, niestety wciąż muszą radzić sobie z obiektami SettingElement, które znajdują się w zbiorze ustawień w tych sekcjach. Każdy musi mieć deserializację do typu właściwości, chyba że jest to ciąg, np. dla applicationSettings SettingElement (jeden, który nie może być dynamicznie aktualizowanych w czasie pracy):
(ćwicząca)
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);
}
nieruchomości w ciąg łatwiej jest (ten przykład jest w zasadzie zbędny z pierwszym powyżej):
var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml
.InnerText
Wszystkie te przykłady były konfigurowane za pomocą aplikacjiUstawienia. To samo podejście może działać z userSettings z dodatkiem prawdopodobnie niektórych metod zapisu i tak dalej, i musisz śledzić (mniej więcej), które z wielu wielu plików konfiguracyjnych są w grze - main, roaming lub local .
Dlaczego to robię? Ponieważ dwie powiązane aplikacje i wspólna biblioteka klas (lub biblioteki) muszą korzystać z tych samych ustawień, które są własnością jednej z aplikacji, w których ustawienia są zarządzane wizualnie. Czy ktoś rozwiązał to w lepszy sposób?
Dzięki.
OK. W ten sposób mogę odczytać tablicę znaków. Ale ciągi pochodzą od domyślnej skompilowanej do złożenia. Muszę mieć możliwość dodawania, usuwania i zmieniania ciągów w tej kolekcji po wdrożeniu zestawu. Plik .Properties.Settings.Default nie przechwytuje zmian w pliku .config. Wystąpił ten sam problem z ciągami połączeń, dopóki nie zacząłem przechodzić przez menedżer konfiguracji ConfigurationManager. –
Prawdopodobnie potrzebujesz dostępu do metody menedżera ConfigurationManager: ConfigurationManager.GetSection ("applicationSettings"); który powinien zwrócić obiekt, dla którego chcesz przeanalizować – jkelley
ConfigurationManager.GetSection ("applicationSettings") zwraca wartość null –