ClickOnce и IsolatedStorage

Приложение Winform выпускается с помощью ClickOnce в нашей интрасети. Мы сохраняем личные предпочтения GUI в изолированном хранилище. Все работает очень хорошо :)

Проблема в том, что когда у нас есть новая версия приложения, мы публикуем ... все настройки теряются! Пользователю необходимо настроить свои предпочтения снова и снова.

Есть ли способ заморозить изоляцию для всего приложения вместо версии?

9

4 ответы

Вам нужно использовать область application , а не область domain , изолированное хранилище. Это можно сделать, используя один из перегруженных конструкторов IsolStorageFileStream .

Пример:

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() выдаст исключение.

Проблема вокруг this заключается в том, чтобы убедиться, что AppDomain.CurrentDomain.ActivationContext не имеет значения null, прежде чем пытаться использовать изолированное хранилище приложений.

17
добавлено
любой образец полного исходного кода? с использованием переменной «IsolatedStorageFileStream fs»?
добавлено автор Kiquenet, источник
Я попробую это. Пожалуй, лучший ответ.
добавлено автор Patrick Desjardins, источник
Я запускаю внутри VS и не вызывает никаких ошибок. Я принимаю ваш ответ, не тестируя его с реальным развертыванием. Я напишу здесь, если это не сработает. Спасибо
добавлено автор Patrick Desjardins, источник
или вы можете использовать System.Deployment.Application.ApplicationDeployment.IsNetwor & zwnj; kDeployed , чтобы узнать, было ли приложение развернуто с помощью ClickOnce, и вы можете использовать GetUserStoreForApplication ()
добавлено автор bithavoc, источник

Я работал над приложением ClickOnce некоторое время назад и использовал Environment.GetFolderPath (ApplicationData) - например. роуминга, чтобы сохранить все настройки. Работал отлично и пережил многочисленные обновления. Просто создайте subdireectory с именем вашего приложения или CompanyName/AppName или что угодно и сохраните все там.

4
добавлено

Вы должны хранить постоянную версию пользовательских настроек в более надежном хранилище, таком как база данных. Ваше приложение может решить использовать изолированное хранилище, если оно доступно. Если он недоступен (из-за более новой версии), приложение должно получить настройки из базы данных и использовать его для повторной инициализации настроек в изолированном хранилище. Если настройки изменены, вы должны обновить оба места. Если не существует более новой версии приложения, вашему приложению не нужно будет получать настройки из БД.

1
добавлено
Это была первоначальная идея, но мне было интересно узнать, были ли они работой: P
добавлено автор Patrick Desjardins, источник
Вы можете сохранить файл настроек в определенном месте на жестком диске пользователя, но вам нужно будет сделать приложение полностью доверенным.
добавлено автор Gulzar Nazim, источник

резюме из других ответов:

IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();//for visual studio
if (System.Deployment.Application.ApplicationDeployment.IsNetwor‌​kDeployed)
{
    isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();//for click once applications
}
0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)