2008-09-16 15 views
5

Ich speichere Sachen in einer Isolated Storage Datei (mit der Klasse IsolatedStorageFile). Es funktioniert gut, und ich kann die gespeicherten Werte abrufen, wenn ich die Speicher- und Abrufmethoden in meiner Schicht DAL von meiner GUI-Ebene aus aufrufen. Wenn ich jedoch versuche, die gleichen Einstellungen von einer anderen Assembly im selben Projekt abzurufen, bekomme ich eine FileNotFoundException. Was mache ich falsch? Dies ist das allgemeine Konzept:"Konnte Datei nicht finden" bei Verwendung von Isolated Storage

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; 
    } 

Ich habe versucht, alle GetMachineStoreFor * Bereiche verwenden.

EDIT: Da ich mehrere Assemblys für den Zugriff auf die Dateien benötigen, scheint es nicht möglich, mit isoliertem Speicher zu tun, es sei denn, es ist eine ClickOnce Anwendung.

Antwort

4

Wenn Sie die Datei IsolatedStorageFile instanziiert haben, haben Sie sie auf IsolatedStorageScope.Machine festgelegt?

Ok jetzt, dass Sie Ihren Code Stil dargestellt haben, und ich habe wieder auf erneute Prüfung des Verhaltens der Methoden weg, hier ist die Erklärung:

  • GetMachineStoreForAssembly() - scoped an der Maschine und der Montage Identität. Verschiedene Assemblies in derselben Anwendung hätten ihren eigenen isolierten Speicher.
  • GetMachineStoreForDomain() - meiner Meinung nach eine falsche Bezeichnung. Bereich auf die Maschine und die Domänenidentität oben auf die Assembly-Identität. Es hätte eine Option nur für AppDomain geben sollen.
  • GetMachineStoreForApplication() - das ist die, nach der Sie suchen. Ich habe es getestet und verschiedene Baugruppen können die in einer anderen Baugruppe geschriebenen Werte aufnehmen. Der einzige Haken ist, dass die Anwendungsidentität überprüfbar sein muss. Wenn es lokal ausgeführt wird, kann es nicht richtig bestimmt werden und es wird mit der Ausnahme "Anwendungsidentität des Aufrufers kann nicht festgestellt werden" enden. Sie können dies überprüfen, indem Sie die Anwendung über Click Once bereitstellen. Nur dann kann diese Methode angewendet werden und ihre gewünschte Wirkung der gemeinsamen isolierten Speicherung erreichen.
+0

finden. –

+0

Antwort entsprechend aktualisiert. – icelava

1

Wenn Sie speichern, die Sie anrufen GetMachineStoreForDomain, aber wenn Sie abrufen, die Sie anrufen GetMachineStoreForAssembly.

GetMachineStoreForAssembly ist für die Assembly bestimmt, in der der Code ausgeführt wird, während GetMachineStoreForDomain für die aktuell ausgeführte AppDomain und die Assembly bestimmt ist, in der der Code ausgeführt wird. Ändern Sie einfach diese Aufrufe in GetMachineStoreForApplication, und es sollte funktionieren.

Die Dokumentation für IsolatedStorageFile kann ich die Post jetzt den gesamten Code zu zeigen, aktualisiert haben bei http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile_members.aspx

+0

Sorry, das war ein Tippfehler. Ich habe den gleichen Bereich für die Speicher- und die Abrufmethode verwendet. Die Dokumentation hilft mir also nicht. Wie gesagt, ich kann erfolgreich von der GUI speichern und abrufen, aber eine andere Assembly kann es nicht abrufen. –

+0

GetMachineStoreForApplication() versucht, aber nicht behandelt IsolatedStorageException: Kann die Anwendungsidentität des Aufrufers nicht bestimmen – PerlDev

+0

können Sie es in GetMachineStoreForAssembly ändern? –

Verwandte Themen