11

Estoy intentando mantener la configuración del usuario en un archivo de configuración usando ConfigurationManager.Cómo escribir en un archivo User.Config a través de ConfigurationManager?

Quiero limitar estas configuraciones solo al usuario, porque los cambios de la aplicación no se pueden guardar en Vista/Win 7 sin privilegios de administrador.

Esto parece obtener la configuración del usuario, que parece guardarse aquí en Win 7 ([Unidad]: \ Users \ [Nombre de usuario] \ AppData \ Local \ [Nombre de aplicación] \ [Nombre de conjunto] [hash] \ [ versión \)

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 

Siempre que trato de guardar cualquier cambio en absoluto a esta configuración me sale esta excepción:

InnerException: System.InvalidOperationException 
Message="ConfigurationSection properties cannot be edited when locked." 
Source="System.Configuration" 
StackTrace: 
    at System.Configuration.SectionInformation.VerifyIsEditable() 
    at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates) 

he intentado añadir un ConfigurationSection encargo a esta configuración. He intentado agregar a AppSettingsSection. Cada vez que llamo al config.Save() arroja la excepción anterior.

¿Alguna idea?

He intentado utilizar la clase ApplicationSettingsBase a través del proyecto-> configuración del diseñador, pero no parece que pueda guardar tipos personalizados con esto. Quiero una funcionalidad similar con la capacidad de guardar tipos personalizados.

+0

Resulta que PUEDE usar personalizado para tipos con el proyecto-> Diseñador de configuración. No los incluyen en el cuadro de diálogo de tipo, pero si escribe el nombre/espacio de nombre correcto, puede usar cualquier tipo que desee. El tipo debe ser XmlSerializable o convertible a/desde cadena con un TypeConverter. –

Respuesta

8

Es necesario configurar el valor SectionInformation.AllowExeDefinition para la sección:

valor
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming); 
UserSettings settings; 
if ((settings = (UserSettings)configuration.Sections[GENERAL_USER_SETTINGS]) == null) 
{ 
     settings = new UserSettings(); 
     settings.SectionInformation.AllowExeDefinition = 
       ConfigurationAllowExeDefinition.MachineToLocalUser; 
     configuration.Sections.Add(GENERAL_USER_SETTINGS, settings); 
     configuration.Save(); 
} 

El valor predeterminado es ConfigurationAllowExeDefinition.MachineToApplication que sólo permite colocar la sección sobre machine.config y app.exe.config.

+0

Lo intentaré. Intenté configurar la propiedad AllowExeDefinition una vez y causó la misma excepción que config.Save() desencadenada. Copiaré este segmento de código e intentaré de nuevo. –

+0

Parece que necesitaba establecer AllowExeDefinition ANTES de agregar la sección y guardar los cambios por primera vez. Ahora todo parece estar funcionando bien. –

+2

por alguna razón, el uso de _ConfigurationManager.OpenExeConfiguration_ with _ConfigurationUserLevel_ overload no me permitió editar y guardar el archivo al afirmar que las propiedades de _ConfigurationSection no se pueden editar cuando se bloquean_. solo cuando utilicé la sobrecarga _string exepath_, pude guardar la configuración. – itsho

Cuestiones relacionadas