¿Puedo controlar la ubicación de la configuración del usuario .NET para evitar perder la configuración en la actualización de la aplicación?

StackOverflow https://stackoverflow.com/questions/621265

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de personalizar la ubicación del archivo user.config. Actualmente se almacena con un hash y un número de versión

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

Quiero que sea independiente de la versión de la aplicación

%AppData%\[CompanyName]\[ProductName]\

¿Se puede hacer esto y cómo? ¿Cuáles son las implicaciones? ¿Perderá el usuario su configuración de la versión anterior después de la actualización?

¿Fue útil?

Solución

Para responder a la primera pregunta, técnicamente puede colocar el archivo donde lo desee, sin embargo, tendrá que codificarlo usted mismo, ya que el lugar predeterminado al que va el archivo es el primero de sus dos ejemplos. ( enlace a cómo hacerlo usted mismo )

En cuanto a la segunda pregunta, depende de cómo implemente la aplicación. Si implementa a través de un .msi, existen dos valores hash en las propiedades del proyecto de configuración (a partir del cual se construye el msi), el 'código de actualización' y el 'código de producto'. Estos determinan cómo se puede instalar el msi y si se actualiza, se sobrescribe o se instala junto a cualquier otra versión de la misma aplicación.

Por ejemplo, si tiene dos versiones de su software y tienen códigos de 'actualización' diferentes, entonces, para Windows, son piezas de software completamente diferentes, independientemente de cuál sea el nombre. Sin embargo, si el código de 'actualización' es el mismo, pero el código de 'producto' es diferente, cuando intente instalar el segundo msi, le preguntará si desea actualizar, momento en el que se supone que debe copiar los valores del configuración anterior a una nueva configuración. Si ambos valores son iguales y el número de versión no cambió, entonces la nueva configuración estará en la misma ubicación que la configuración anterior, y no tendrá que hacer nada. Documentación de MSDN

ClickOnce es un poco diferente, ya que se basa más en el número de versión de ClickOnce y la ruta de URL, sin embargo, he descubierto que mientras continúe 'Publicando' en la misma ubicación, la nueva versión de la aplicación continuará para usar la configuración existente. ( enlace a cómo ClickOnce maneja las actualizaciones )

También sé que hay una manera de combinar manualmente las configuraciones durante la instalación del msi usando scripts de instalación personalizados, pero no recuerdo los pasos exactos para hacerlo ... (ver este enlace para saber cómo hacerlo con un web.config)

Otros consejos

Quería agregar este texto citado como referencia para cuando tenga este problema en el futuro. Supuestamente, puede indicar a la infraestructura de ApplicationSettings que copie la configuración de una versión anterior llamando a Actualizar :

Properties.Settings.Value.Upgrade();

De Preguntas frecuentes sobre la configuración del cliente publicación de blog: ( archivo )

  

P: ¿Por qué hay un número de versión en la ruta user.config? Si implemento una nueva versión de mi aplicación, ¿el usuario no perderá todas las configuraciones guardadas por la versión anterior?

     

A: Hay un par de razones por las cuales   La ruta user.config es sensible a la versión.

     

(1) Para admitir la implementación en paralelo   de diferentes versiones de un   aplicación (puede hacer esto con   Clickonce, por ejemplo). Es   posible para diferentes versiones de la   aplicación para tener diferentes configuraciones   guardado

     

(2) Cuando actualiza un   aplicación, la clase de configuración puede   han sido alterados y pueden no ser   compatible con lo que se guarda,   lo que puede conducir a problemas.

     

Sin embargo, hemos facilitado   actualizar la configuración de un anterior   versión de la aplicación a la   último. Simplemente llame    ApplicationSettingsBase.Upgrade () y   recuperará la configuración del   versión anterior que coincida con   versión actual de la clase y tienda   ellos en la versión actual   archivo user.config. También tienes el   opción de anular este comportamiento   ya sea en su clase de configuración o en   la implementación de su proveedor.

     

P: De acuerdo, pero ¿cómo sé cuándo   ¿Actualizar llamada?

     

A: Buena pregunta. En Clickonce, cuando   instalas una nueva versión de tu   aplicación, ApplicationSettingsBase   lo detectará y automáticamente   actualizar la configuración para usted en el momento   Se cargan las configuraciones. En no Clickonce   casos, no hay actualización automática -   tienes que llamar a Upgrade tú mismo.   Aquí hay una idea para determinar cuándo   para llamar a Upgrade:

     

Tener una configuración booleana llamada   CallUpgrade y dale un valor predeterminado   valor de verdad. Cuando comienza tu aplicación   arriba, puedes hacer algo como:

if (Properties.Settings.Value.CallUpgrade)
{
   Properties.Settings.Value.Upgrade();
   Properties.Settings.Value.CallUpgrade = false;    
}
  

Esto asegurará que Upgrade () sea   llamado solo la primera vez que el   la aplicación se ejecuta después de una nueva versión   está implementado.

No creo por un segundo que realmente pueda funcionar: no hay forma de que Microsoft proporcione esta capacidad, pero el método es el mismo.

El archivo user.config se almacena en

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

<c:\Documents and Settings> es el directorio de datos del usuario, ya sea no itinerante (Configuración local arriba) o itinerante.
<username> es el nombre de usuario.
<companyname> es el valor CompanyNameAttribute, si está disponible. De lo contrario, ignore este elemento.
<appdomainname> es el AppDomain.CurrentDomain.FriendlyName. Por lo general, el valor predeterminado es el nombre .exe.
<eid> es la URL, StrongName o Path, según la evidencia disponible para el hash.
<hash> es un hash SHA1 de evidencia recopilada del CurrentDomain, en el siguiente orden de preferencia:
    1. StrongName
    2. URL:
Si ninguno de estos está disponible, use la ruta .exe.
<version> es la configuración AssemblyVersionAttribute de AssemblyInfo.

La descripción completa está aquí http://msdn.microsoft.com/en-us/library /ms379611.aspx

(Añadiría esto como un comentario a la respuesta de @ Amr, pero todavía no tengo suficiente representante para hacerlo.)

La información en el artículo de MSDN es muy clara y parece siguen aplicando. Sin embargo, no menciona que el hash SHA1 está escrito en base 32 codificado, en lugar de la base 16 más típica.

Creo que el algoritmo utilizado se implementa en ToBase32StringSuitableForDirName, que se puede encontrar aquí en la Fuente de referencia de Microsoft .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top