ClickOnce und IsolatedStorage

Die Winform-Anwendung wird mit ClickOnce in unserem Intranet veröffentlicht. Wir speichern persönliche Präferenzen für die GUI im isolierten Speicher. Alles funktioniert ziemlich gut :)

Das Problem ist, wenn wir eine neue Version der Anwendung haben, veröffentlichen wir ... alle Einstellungen sind verloren! Benutzer müssen ihre Präferenz für jede Version festlegen.

Gibt es eine Möglichkeit, die Isolation für die gesamte Anwendung statt der Version einzufrieren?

9

4 Antworten

Sie müssen den Bereich für die Anwendung verwenden, der sich auf den isolierten Speicher bezieht und nicht auf Domäne . Dies kann mithilfe eines der überladenen Konstruktoren von IsolatedStorageFileStream erfolgen.

Beispiel:

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

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

Jetzt jedoch werden Sie feststellen, dass der Code nur dann funktioniert, wenn die Anwendung über ClickOnce gestartet wurde, da dies der einzige verfügbare isolierte Speicher für Anwendungen ist. Wenn Sie nicht über ClickOnce (z. B. über Visual Studio) starten, löst GetUserStoreForApplication() eine Ausnahme aus.

Das Problem dieses Problem besteht darin, sicherzustellen, dass AppDomain.CurrentDomain.ActivationContext nicht NULL ist, bevor versucht wird, isolierten Speicher mit Anwendungsbereich zu verwenden.

17
hinzugefügt
ein vollständiges Quellcode-Beispiel? Probe mit "IsolatedStorageFileStream fs" Variable?
hinzugefügt der Autor Kiquenet, Quelle
Ich werde das versuchen. Scheint die beste Antwort zu sein.
hinzugefügt der Autor Patrick Desjardins, Quelle
Ich laufe innerhalb VS und es verursacht keinen Fehler. Ich akzeptiere deine Antwort, ohne sie noch mit dem richtigen Einsatz zu testen. Ich schreibe hier zurück, wenn es nicht funktioniert. Danke
hinzugefügt der Autor Patrick Desjardins, Quelle
oder Sie können System.Deployment.Application.ApplicationDeployment.IsNetwor & zwnj; kDeployed verwenden, um zu wissen, ob die App mit ClickOnce bereitgestellt wurde, und Sie GetUserStoreForApplication() verwenden können.
hinzugefügt der Autor bithavoc, Quelle

Ich habe vor einiger Zeit an einer ClickOnce-App gearbeitet und Environment.GetFolderPath (ApplicationData) verwendet - z. Roaming-App-Datenordner, um alle Einstellungen zu speichern. Arbeitete gut und überlebte zahlreiche Updates. Erstellen Sie einfach ein Unterverzeichnis mit dem Namen Ihrer App oder CompanyName/AppName oder was auch immer und speichern Sie alles dort drin.

4
hinzugefügt

Sie müssen eine permanente Version der Benutzereinstellungen in einer dauerhafteren Datenbank speichern. Ihre Anwendung kann entscheiden, den isolierten Speicher zu verwenden, wenn dieser verfügbar ist. Wenn es nicht verfügbar ist (wegen einer neueren Version), sollte die App die Einstellungen von der Datenbank abrufen und sie verwenden, um die Einstellungen im isolierten Speicher neu zu initialisieren. Wenn Einstellungen geändert werden, sollten Sie beide Orte aktualisieren. Wenn es keine neuere Version der App gibt, sollte Ihre App die Einstellungen nicht von der DB abrufen müssen.

1
hinzugefügt
Das war meine anfängliche Idee, aber ich war interessant zu wissen, ob sie eine Arbeit waren: P
hinzugefügt der Autor Patrick Desjardins, Quelle
Sie können die Einstellungsdatei an einem bestimmten Ort auf der Festplatte des Benutzers speichern, aber Sie müssen die App voll vertrauenswürdig machen.
hinzugefügt der Autor Gulzar Nazim, Quelle

eine Zusammenfassung aus den anderen Antworten:

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