четверг, января 19, 2006

Application settings in C# 2.0 continued

Обнаружилась засада - не может засады не быть!
 
Для проекта типа "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 { }
        }
    }
}

Использование:

object osettings = new Settings();
LoadSettings(
ref osettings);
settings = (
Settings)osettings;

Примечание. При настройке параметров в VS 2005 область действия (Scope) следует установить User (иначе будет сгенерён класс Settings с readonly свойствами).

1 комментарий:

Анонимный комментирует...

Спасибо. Очень помогло.