ClickOnce и IsolatedStorage
-
03-07-2019 - |
Вопрос
Приложение Winform выпускается вместе с ClickOnce в нашей интрасети.Мы храним личные предпочтения в отношении графического интерфейса пользователя в Изолированном хранилище.Все работает довольно нормально :)
Проблема в том, что когда у нас появляется новая версия приложения, мы ее публикуем...все предпочтения потеряны!Пользователю необходимо настраивать свои предпочтения снова и снова для каждой версии.
Есть ли способ заморозить изоляцию для всего приложения, а не для версии?
Решение
Вам нужно использовать применение ограниченный, а не домен ограниченное, изолированное хранилище.Это можно сделать с помощью одного из IsolatedStorageFileStream-х годов перегруженные конструкторы.
Пример:
using System.IO;
using System.IO.IsolatedStorage;
...
IsolatedStorageFile appScope = IsolatedStorageFile.GetUserStoreForApplication();
using(IsolatedStorageFileStream fs = new IsolatedStorageFileStream("data.dat", FileMode.OpenOrCreate, appScope))
{
...
Однако теперь вы столкнетесь с проблемой того, что этот код работает только тогда, когда приложение запущено через ClickOnce, потому что это единственный раз, когда доступно изолированное хранилище с областью действия приложения.Если вы не запускаетесь через ClickOnce (например, через Visual Studio), GetUserStoreForApplication() выдаст исключение.
Обходной путь это проблема в том, чтобы убедиться Домен приложения.Текущий домен.ActivationContext не равно нулю перед попыткой использовать изолированное хранилище в области приложения.
Другие советы
Некоторое время назад я работал над приложением ClickOnce и использовал среду.GetFolderPath(ApplicationData) - напримерперемещаемая папка данных приложения для хранения всех настроек.Работал нормально и пережил многочисленные обновления.Просто создайте подраздел с именем вашего приложения или CompanyName / AppName или чем-то еще и сохраните все там.
краткое изложение других ответов:
IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();//for visual studio
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();//for click once applications
}
Вы должны хранить постоянную версию пользовательских настроек в более надежном хранилище, таком как база данных.Ваше приложение может решить использовать изолированное хранилище, если оно доступно.Если он недоступен (из-за более новой версии), приложение должно получить настройки из базы данных и использовать их для повторной инициализации настроек в изолированном хранилище.Если настройки изменены, вам следует обновить оба места.Если нет более новой версии приложения, вашему приложению не нужно получать настройки из базы данных.