ClickOnce e IsolatedStorage

O aplicativo Winform é lançado com o ClickOnce na nossa intranet. Armazenamos a preferência pessoal da GUI no armazenamento isolado. Tudo funciona muito bem :)

O problema é quando temos uma nova versão do aplicativo, nós publicamos ... todas as preferências são perdidas! O usuário precisa configurar sua preferência repetidamente em cada versão.

Existe uma maneira de congelar o isolamento para todo o aplicativo em vez da versão?

9

4 Respostas

É necessário usar application escopo, em vez de domínio com escopo, armazenamento isolado. Isso pode ser feito usando um dos construtores sobrecarregados do IsolatedStorageFileStream .

Exemplo:

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

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

No entanto, agora você vai encontrar o problema desse código funcionando somente quando o aplicativo for lançado via ClickOnce, porque esse é o único armazenamento de tempo com escopo de aplicativo disponível disponível. Se você não iniciar por meio do ClickOnce (como o Visual Studio), o GetUserStoreForApplication() lançará uma exceção.

A maneira de contornar este problema é garantir que AppDomain.CurrentDomain.ActivationContext não seja nulo antes de tentar usar o armazenamento isolado com escopo de aplicativo.

17
adicionado
alguma amostra completa de código-fonte? amostra usando a variável "IsolatedStorageFileStream fs"?
adicionado o autor Kiquenet, fonte
Eu vou tentar isso. Parece ser a melhor resposta ainda.
adicionado o autor Patrick Desjardins, fonte
Estou correndo dentro do VS e ele não causa nenhum erro. Eu aceito sua resposta sem testá-lo ainda com a implantação real. Vou escrever de volta aqui se não funcionar. THX
adicionado o autor Patrick Desjardins, fonte
ou você pode usar System.Deployment.Application.ApplicationDeployment.IsNetwor & zwnj; kDeployed para saber se o aplicativo foi implantado com ClickOnce e você pode usar GetUserStoreForApplication ()
adicionado o autor bithavoc, fonte

Eu estava trabalhando em um aplicativo ClickOnce há um tempo atrás e usei Environment.GetFolderPath (ApplicationData) - por exemplo, pasta de dados do aplicativo em roaming, para armazenar todas as configurações. Funcionou bem e sobreviveu a numerosas atualizações. Basta criar um subdiretório com o nome do seu aplicativo ou CompanyName/AppName ou qualquer outra coisa e armazenar tudo lá.

4
adicionado

Você precisa armazenar uma versão permanente das configurações do usuário em um armazenamento mais durável, como o banco de dados. Seu aplicativo pode decidir usar o armazenamento isolado, se estiver disponível. Se não estiver disponível (por causa de uma versão mais recente), o aplicativo deve obter as configurações do banco de dados e usá-lo para reinicializar as configurações no armazenamento isolado. Se as configurações forem alteradas, você deverá atualizar os dois locais. A menos que haja uma versão mais recente do aplicativo, seu aplicativo não deverá ter as configurações do banco de dados.

1
adicionado
Essa foi a ideia inicial de mi, mas eu era interessante saber se eles eram um trabalho em torno de: P
adicionado o autor Patrick Desjardins, fonte
Você pode armazenar o arquivo de configurações em um local específico no disco rígido do usuário, mas você terá que fazer o aplicativo de confiança total ..
adicionado o autor Gulzar Nazim, fonte

um resumo das outras respostas:

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