2008-10-14 11 views
9

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 :)ClickOnce y IsolatedStorage

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?

Respuesta

17

Es necesario utilizar la aplicación con ámbito, en lugar de dominio con ámbito, el almacenamiento aislado. Esto se puede hacer utilizando uno de IsolatedStorageFileStream's constructores sobrecargados.

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 que se ejecutará en el tema de este código sólo funciona cuando la aplicación se ha puesto en marcha a través de ClickOnce, porque esa es la única aplicación en tiempo de ámbito aislado de almacenamiento está disponible. Si no inicia mediante ClickOnce (por ejemplo, a través de Visual Studio), GetUserStoreForApplication() lanzará una excepción.

La forma de evitar este problema es asegurarse de AppDomain.CurrentDomain.ActivationContext no es nulo antes de intentar usar aplicación en el ámbito de almacenamiento aislado.

+0

Lo intentaré. Parece ser la mejor respuesta hasta ahora. –

+0

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. Thx –

+3

o puede usar * System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed * para saber si la aplicación se implementó con ClickOnce y puede usar GetUserStoreForApplication() – bithavoc

1

Tienes que 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.

+0

Esa era mi idea inicial, pero era interesante saber si se tratara de una obra en torno a: P –

+0

Puede almacenar la configuración del archivo en una ubicación específica en el disco duro del usuario, pero tendrá que hacer que la aplicación sea de plena confianza. –

4

Hace un tiempo estaba trabajando en una aplicación ClickOnce y utilicé 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í.

0

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 
}