ClickOnce y IsolatedStorage

La aplicación Winform se lanza con ClickOnce en nuestra Intranet. Almacenamos preferencias personales para la GUI en el Almacenamiento Aislado. Todo funciona bastante bien :)

El problema es cuando tenemos una nueva versión de la aplicación, publicamos ... ¡todas las preferencias se pierden! El usuario necesita configurar sus preferencias una y otra vez.

¿Hay alguna forma de congelar el aislamiento para toda la aplicación en lugar de la versión?

9

4 Respuestas

Debe utilizar el ámbito aislado de aplicación , en lugar del dominio con ámbito. Esto se puede hacer utilizando uno de los constructores sobrecargados de IsolatedStorageFileStream .

Ejemplo:

using System.IO;
using System.IO.IsolatedStorage;
...

IsolatedStorageFile appScope = IsolatedStorageFile.GetUserStoreForApplication();    
using(IsolatedStorageFileStream fs = new IsolatedStorageFileStream("data.dat", FileMode.OpenOrCreate, appScope))
{
...

Sin embargo, ahora se encontrará con el problema de que este código solo funciona cuando la aplicación se ha lanzado a través de ClickOnce porque es la única vez que el almacenamiento aislado del alcance de la aplicación está disponible. Si no inicia mediante ClickOnce (por ejemplo, a través de Visual Studio), GetUserStoreForApplication() emitirá una excepción.

La forma de resolver este problema es asegurarse de que AppDomain.CurrentDomain.ActivationContext no sea nulo antes de intentar usar el almacenamiento aislado del ámbito de la aplicación.

17
agregado
cualquier muestra de código fuente completo? muestra utilizando la variable "IsolatedStorageFileStream fs"?
agregado el autor Kiquenet, fuente
Probaré eso. Parece ser la mejor respuesta hasta ahora.
agregado el autor Patrick Desjardins, fuente
Me estoy ejecutando dentro de VS y no genera ningún error. Acepto su respuesta sin probarla aún con la implementación real. Volveré a escribir aquí si no funciona. Gracias
agregado el autor Patrick Desjardins, fuente
o puede usar System.Deployment.ApplicationDeployment.IsNetwor & zwnj; kDeployed para saber si la aplicación se implementó con ClickOnce y puede usar GetUserStoreForApplication ()
agregado el autor bithavoc, fuente

Estuve trabajando en una aplicación ClickOnce hace un tiempo y usé Environment.GetFolderPath (ApplicationData) - p. roaming de la carpeta de datos de la aplicación, para almacenar todas las configuraciones. Funcionó bien y sobrevivió a numerosas actualizaciones. Simplemente cree una subdirectoría con el nombre de su aplicación o CompanyName/AppName o lo que sea y almacene todo allí.

4
agregado

Debe almacenar una versión permanente de la configuración del usuario en una tienda más duradera como base de datos. Su aplicación puede decidir utilizar el almacenamiento aislado si está disponible. Si no está disponible (debido a una versión más nueva), la aplicación debe obtener la configuración de la base de datos y usarla para reiniciar la configuración en el almacenamiento aislado. Si se cambian las configuraciones, debe actualizar ambos lugares. A menos que haya una versión más nueva de la aplicación, su aplicación no debería tener que obtener la configuración de DB.

1
agregado
Esa fue mi idea inicial, pero era interesante saber si funcionaban bien: P
agregado el autor Patrick Desjardins, fuente
Puede almacenar el archivo de configuración en una ubicación específica en el disco duro del usuario, pero deberá hacer que la aplicación sea de plena confianza.
agregado el autor Gulzar Nazim, fuente

un resumen de las otras respuestas:

IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();//for visual studio
if (System.Deployment.Application.ApplicationDeployment.IsNetwor‌​kDeployed)
{
    isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();//for click once applications
}
0
agregado