2008-10-14 11 views
5

Creé una forma de agregar dinámicamente SettingsProperty a un archivo .NET app.config. Todo funciona bien, pero cuando estoy lanzando mi aplicación la próxima vez solo puedo ver las propiedades que se crean en el diseñador. ¿Cómo puedo cargar el tiempo de ejecución de las propiedades?¿Cómo volver a cargar una propiedad de configuración creada dinámicamente la próxima vez?

Mi código para crear la SettingsProperty tiene el siguiente aspecto:

internal void CreateProperty<T>(string propertyName) 
{ 
    string providerName = "LocalFileSettingsProvider"; 
    System.Configuration.SettingsAttributeDictionary attributes = new SettingsAttributeDictionary(); 
    System.Configuration.UserScopedSettingAttribute attr = new UserScopedSettingAttribute(); 

    attributes.Add(attr.TypeId, attr); 

    System.Configuration.SettingsProperty prop; 
    SettingsProvider provider = ApplicationEnvironment.GlobalSettings.Providers[providerName]; 

    prop = new System.Configuration.SettingsProperty(
     propertyName, 
     typeof(T), 
     provider, 
     false, 
     default(T), 
     System.Configuration.SettingsSerializeAs.String, 
     attributes, 
     false, 
     false 
    ); 

    ApplicationEnvironment.GlobalSettings.Properties.Add(prop); 
    ApplicationEnvironment.GlobalSettings.Reload(); 
} 

Cuando la próxima ejecución pido la propiedad de configuración no pude encontrar ninguna de las propiedades creadas previosuly. No importa si llamo al ApplicationEnvironment.GlobalSettings.Reload(); o no.

Respuesta

1

Las configuraciones de configuración definidas por el usuario están vinculadas a la versión de ensamblaje con la que se crearon. Si tiene un número de versión móvil (1.0. . por ejemplo), perderá la configuración desde la última ejecución.

1

Me encontré con el mismo problema. En mi humilde opinión, el problema es que el objeto .NET System.Configuration.SettingsBase utiliza la reflexión para determinar los nombres, tipos, etc. de las propiedades que se deben cargar desde el almacenamiento persistente. Y cuando agrega una propiedad de configuración dinámica, esta información falta. Por lo tanto, deberá agregar la definición de propiedad de configuración no solo antes de guardar el valor, sino también antes de leer. En su caso, debe ser algo como esto

... 
// the name and type of the property being read must be known at this point 
CreateProperty<T>(propertyName); 
ApplicationEnvironment.GlobalSettings.Reload(); 
T propertyValue = ApplicationEnvironment.GlobalSettings[propertyName]; 

Es posible que desee llamar al método CreateProperty al comienzo de todas las propiedades que desea utilizar y luego llamar Reload sólo una vez. En ambos casos, deberá conocer los nombres y tipos de las propiedades.

Cuestiones relacionadas