2008-09-16 30 views
5

Guardo cosas en un archivo Isolated Storage (utilizando la clase IsolatedStorageFile). Funciona bien, y puedo recuperar los valores guardados al llamar a los métodos de guardado y recuperación en mi capa DAL desde mi capa de la GUI. Sin embargo, cuando trato de recuperar la misma configuración de otro ensamblado en el mismo proyecto, me da una excepción FileNotFoundException. ¿Qué hago mal? Este es el concepto general:"No se pudo encontrar el archivo" al utilizar Almacenamiento aislado

public void Save(int number) 
    { 
     IsolatedStorageFile storage = IsolatedStorageFile.GetMachineStoreForAssembly(); 
     IsolatedStorageFileStream fileStream = 
      new IsolatedStorageFileStream(filename, FileMode.OpenOrCreate, storage); 

     StreamWriter writer = new StreamWriter(fileStream); 
     writer.WriteLine(number); 
     writer.Close(); 
    } 

    public int Retrieve() 
    { 
     IsolatedStorageFile storage = IsolatedStorageFile.GetMachineStoreForAssembly(); 
     IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(filename, FileMode.Open, storage); 

     StreamReader reader = new StreamReader(fileStream); 

     int number; 

     try 
     { 
      string line = reader.ReadLine(); 
      number = int.Parse(line); 
     } 
     finally 
     { 
      reader.Close(); 
     } 

     return number; 
    } 

He intentado utilizar todos los ámbitos GetMachineStoreFor *.

EDITAR: Dado que necesito varios ensambles para acceder a los archivos, no parece posible hacerlo con almacenamiento aislado, a menos que sea una aplicación ClickOnce.

Respuesta

4

Cuando creó la instancia del archivo IsolatedStorage, ¿lo colocó en IsolatedStorageScope.Machine?

Ok ahora que se han ilustrado en su estilo de código y he vuelto a volver a probar el comportamiento de los métodos, aquí está la explicación:

  • GetMachineStoreForAssembly() - con ámbito a la máquina y la identidad de montaje. Diferentes ensamblajes en la misma aplicación tendrían su propio almacenamiento aislado.
  • GetMachineStoreForDomain() - un nombre inapropiado en mi opinión. Enfocado a la máquina y la identidad del dominio en la parte superior de la identidad del ensamblado. Debería haber una opción solo para AppDomain.
  • GetMachineStoreForApplication() - este es el que está buscando. Lo he probado y diferentes conjuntos pueden recoger los valores escritos en otro ensamblaje. El único inconveniente es que la identidad de la aplicación debe ser verificable. Cuando se ejecuta localmente, no se puede determinar adecuadamente y terminará con la excepción "No se puede determinar la identidad de la aplicación de la persona que llama". Se puede verificar mediante la implementación de la aplicación mediante Click Once. Solo entonces se puede aplicar este método y lograr el efecto deseado de almacenamiento aislado compartido.
+0

He actualizado el post ahora para mostrar todo el código. –

+0

Respuesta actualizada en consecuencia. – icelava

1

Cuando está guardando, llama a GetMachineStoreForDomain, pero cuando está recuperando, llama a GetMachineStoreForAssembly.

GetMachineStoreForAssembly tiene como objetivo el ensamblado en el que se está ejecutando el código, mientras que GetMachineStoreForDomain tiene como ámbito el dominio de aplicación en ejecución y el ensamblado donde se está ejecutando el código. Simplemente cambie sus llamadas a GetMachineStoreForApplication, y debería funcionar.

La documentación para IsolatedStorageFile se puede encontrar en http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile_members.aspx

+0

Disculpa, eso fue un error tipográfico. Usé el mismo alcance para los métodos de guardar y recuperar. Entonces la documentación no me está ayudando aquí. Como dije, puedo guardar y recuperar con éxito desde la GUI, pero otro ensamblado no puede recuperarlo. –

+0

Intentó GetMachineStoreForApplication(), pero no se controló IsolatedStorageException: no se puede determinar la identidad de la aplicación de la persona que llama – PerlDev

+0

¿Se puede cambiar a GetMachineStoreForAssembly? –

Cuestiones relacionadas