Обнаружилась засада - не может засады не быть!
Для проекта типа "Class Library" можно задать настройки ровно так же, как и для проекта "Application". Разница небольшая - при загрузке сборки чтения конфига не происходит. Даже принудительное перечитывание при помощи settings.Reload(); ничего не прибавляет. Модуль работает с теми значениями настроек, которые были записаны в качестве default'ных.
Пришлось написать процедуру считывания значений настроек.
void LoadSettings(ref object settings) {
PropertyInfo[] props = settings.GetType().GetProperties();
string path = this.GetType().Assembly.Location;
string cfgpath=path+".config";
if (! File.Exists(cfgpath)) return;
XmlDocument cfg = new XmlDocument();
try {
cfg.Load(cfgpath);
} catch (Exception err) {
....
return;
}
foreach (PropertyInfo prop in props) {
if (!prop.CanWrite) continue;
XmlNode setting = cfg.SelectSingleNode("//setting[@name = '" + prop.Name + "']" );
object value = "";
if (setting != null) {
try {
value = setting.SelectSingleNode("value").InnerText;
prop.SetValue(settings, value, null);
} catch { }
}
}
}
void LoadSettings(ref object settings) {
PropertyInfo[] props = settings.GetType().GetProperties();
string path = this.GetType().Assembly.Location;
string cfgpath=path+".config";
if (! File.Exists(cfgpath)) return;
XmlDocument cfg = new XmlDocument();
try {
cfg.Load(cfgpath);
} catch (Exception err) {
....
return;
}
foreach (PropertyInfo prop in props) {
if (!prop.CanWrite) continue;
XmlNode setting = cfg.SelectSingleNode("//setting[@name = '" + prop.Name + "']" );
object value = "";
if (setting != null) {
try {
value = setting.SelectSingleNode("value").InnerText;
prop.SetValue(settings, value, null);
} catch { }
}
}
}
Использование:
object osettings = new Settings();
LoadSettings(ref osettings);
settings = (Settings)osettings;
Примечание. При настройке параметров в VS 2005 область действия (Scope) следует установить User (иначе будет сгенерён класс Settings с readonly свойствами).
1 комментарий:
Спасибо. Очень помогло.
Отправить комментарий