modificar guardar from archivo application c# .net winforms settings versioning

c# - guardar - Mantener la configuración del usuario después de modificar la versión de ensamblaje/archivo



settings designer c# (2)

Así es como lo resolví.

En la aplicación GUI es muy fácil restaurar la configuración ejecutando

Properties.Settings.Default.Upgrade (); Properties.Settings.Default.Reload (); Properties.Settings.Default.NewVersionInstalled = false; Properties.Settings.Default.Save ();

Sin embargo, siempre he tenido el problema de que todas las demás bibliotecas perdieron su configuración cuando se instaló una nueva versión. Con la siguiente implementación, el software se ejecuta en todos los ensamblajes del dominio de aplicación y restaura la configuración de la biblioteca correspondiente:

foreach(var _Assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach(var _Type in _Assembly.GetTypes()) { if(_Type.Name == "Settings" && typeof(SettingsBase).IsAssignableFrom(_Type)) { var settings = (ApplicationSettingsBase)_Type.GetProperty("Default").GetValue(null, null); if(settings != null) { settings.Upgrade(); settings.Reload(); settings.Save(); } } } }

He implementado el código en el App.xaml.cs del proyecto GUI y siempre se ejecutará cuando la configuración "NewVersionInstalled" se haya establecido en verdadero con una nueva versión.

¡Espero que esto ayude!

Fondo
Tengo una aplicación WinForms simple escrita en C #. Discutí las soluciones de implementación por un tiempo, pero finalmente decidí abandonar ClickOnce, ya que algunas de las restricciones eran cruciales y restrictivas.

En su lugar, he adaptado una solución simple de versionar la aplicación a través de las versiones de ensamblaje / archivo (las mantengo sincronizadas) en las propiedades de la aplicación. Estoy implementando a través de un Proyecto de Configuración (* .msi). Almaceno el último número de versión de ensamblaje en un archivo XML en línea, así como el último archivo de instalación. En tiempo de ejecución, simplemente verifico Application.ProductVersion con la última versión en línea y abro un cuadro de diálogo de actualización si hay una actualización disponible.

Problema
Esto ha funcionado bastante bien hasta ahora, pero recientemente he notado un problema importante con este enfoque. Cuando se actualiza la versión de ensamblaje de la aplicación, se crea una nueva versión del archivo de configuración del usuario (user.config) en AppData / Compañía / Producto / Versión / blahblahblah. Esto obviamente obliga al usuario a restablecer todo en la nueva versión.

Las soluciones sugeridas
No estoy seguro de cómo proceder. La aplicación solo tiene 1 versión hasta el momento y la base de usuarios actual es básicamente la persona a la que puedo pedirle que la pruebe, por lo que cambiar las estrategias no es un gran problema. He considerado:

1.) Escribir mi propio sistema de configuración y así tener un control completo sobre dónde y cómo se almacena y utiliza el archivo de configuración.
2.) Repensar mi estrategia de creación de versiones / actualización para que la actualización no se base en la versión de ensamblaje. No estoy seguro de cómo haría esto, pero mis pruebas parecían revelar que incluso la creación e instalación de una nueva versión con la misma versión de ensamblaje aún afectaría a user.config.

Supongo que lo que realmente pregunto es si hay alguna forma de preservar la configuración predeterminada, ya que es muy fácil de usar y también se adapta a mi estrategia de implementación.


Utilice las clases de configuración incorporadas, solo necesita actualizar la configuración cada vez que cambie la versión de la aplicación. Aquí se explica cómo hacerlo: en el archivo Settings.settings, cree una nueva configuración UpdateSettings type = bool Scope = User Value = True

Incluya el siguiente código antes de usar cualquier configuración (puede ejecutarse cada vez que se ejecuta la aplicación, ya que esto también facilita la ejecución en el depurador)

// Copy user settings from previous application version if necessary if (MyApp.Properties.Settings.Default.UpdateSettings) { MyApp.Properties.Settings.Default.Upgrade(); MyApp.Properties.Settings.Default.UpdateSettings = false; MyApp.Properties.Settings.Default.Save(); }

Cuando se ejecute la nueva versión de la aplicación, UpdateSettings tendrá un valor predeterminado de Verdadero y no se usará ninguna de sus configuraciones anteriores. Si UpdateSettings es verdadero, actualizamos la configuración de la configuración anterior y la guardamos bajo la nueva versión de la aplicación.