Qual é a melhor maneira para um aplicativo winforms .NET para se atualizar sem usar ClickOnce?

StackOverflow https://stackoverflow.com/questions/150994

Pergunta

Por razões técnicas, não posso usar ClickOnce para auto-update minha aplicação .NET e suas montagens. Qual é a melhor maneira de lidar com auto-atualização em .NET?

Foi útil?

Solução

Eu acho que a Updater Application Block era uma espécie de precursor para ClickOnce. Pode valer a pena investigar. Olhando para o código-fonte pode ser suficiente para desencadear algumas idéias.

Outras dicas

Nós temos um produto que é comercial open source /: wyBuild & wyUpdate . Tem remendar capacidade e é simples morto para uso.

Editar: Eu estou ficando votado para baixo nos números negativos, mas o meu post não foi apenas de venda flagrante. Nossa atualizador, wyUpdate, é open source, escrito em C # e está licenciado sob a licença BSD.

Eu pensei que poderia ajudar alguém tentando construir um atualizador do zero usando o framework .NET.

Mas, votar-me para baixo, se necessário.

Cerca de 3-4 anos atrás, publiquei um exemplo que fica fora do aplicativo, se uma atualização for detectado, o aplicativo chama o atualizador ans é desligado, em seguida, as atualizações são feitas, e o aplicativo é reiniciado.

publiquei o exemplo no site antigo GotDotNet ... eu vou ter que tentar encontrá-lo.

Ele trabalhou perfeito e levou cerca de 1-2 horas para escrever.

Indigo Rose tem um produto chamado TrueUpdate que também faz isso para você. Eu tenho usado eles no passado de ambos os aplicativos gerenciados e não gerenciados. É basicamente um arquivo que colocou em seu servidor (HTTP, FTP, o que quiser). Em seguida, você chamar um EXE lado do cliente para verificar se há atualizações. O arquivo de atualização é puxado e tem lógica para detectar qual a versão é no cliente (a sua escolha, detecção DLL, chave de registro lê, etc). Em seguida, ele vai encontrar o atualizador apropriado para ele e baixar o arquivo para execução. Ele funciona bem através de proxies também.

A única coisa que eles não fazem é realmente construir os patches para você. Você tem que fazer isso manualmente, ou com outro produto que eles têm. É uma solução commcerial e funciona muito bem mas se você precisar dele.

Como ponto de partida para seu próprio material circulante, é provavelmente vale a pena olhar Alex o artigo de Feinman no MSDN intitulado "Criando aplicativos auto-atualização com o .NET Compact Framework".

Escreva a sua própria.

Ouvi dizer que eles são um pouco difícil de escrever pela primeira vez, mas depois que ele fica simples.

Desde que eu não tenha escrito um ainda (embora seu na minha lista), eu posso dar-lhe algumas das coisas que eu ter pensado. Manter versões precisas dll, como este é importante para a auto atualização. E certifique-se de que o atualizador pode atualizar-se.

No arquivo Program.cs fazer algo como isto:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Update();
        Application.Run(new Form1());
    }

    private static void Update()
    {
        string mainFolder;
        string updateFolder;
        string backupFolder;

        foreach (string file in
            System.IO.Directory.GetFiles(updateFolder))
        {
            string newFile = file.Replace(
                updateFolder, mainFolder);

            if (System.IO.File.Exists(newFile))
            {
                System.IO.File.Replace(file, newFile, backupFolder);
            }
            else
            {
                System.IO.File.Move(file, newFile);
            }
        }
    }

Além disso, ele pode ser feito recursiva para pegar estrutura de diretórios, se necessário. Isto irá permitir que você atualizar qualquer .dll em seu projeto; tudo, na verdade, fora do .exe principal. Em seguida, em outro lugar dentro de sua aplicação, você pode lidar com a obtenção dos arquivos de seu servidor (ou onde) que precisam ser atualizados, coloque então na UpdateFolder e reiniciar o aplicativo.

Em um projeto há muito tempo, usando o .NET Compact Framework 1.0, eu escrevi um aplicativo de atualização automática. Nós utilizado recurso de implantação de CAB de SQLCE para obter os arquivos para o dispositivo (você usaria Sync Framework agora), e tivemos uma exe separado que fez a descompactação do CAB, e atualizar os arquivos.

Uma atualização iria assim: o usuário será solicitado a atualização, clique em um botão e cair fora da aplicação UI. O exe updater assumiria, obter o arquivo de táxi a partir do servidor, backup as DLLs atuais e descompactar o arquivo cab com wceload. A interface do usuário, então, ser reiniciado, e se ele falhou, a atualização será revertida. Este ainda é um cenário interessante em dispositivos compactos, mas existem ferramentas melhores agora do que apenas sqlce.

Eu certamente olhar para bloco de aplicação de actualização e um quadro de sincronismo para implementar esta se clickonce não é uma opção. Mas eu estou supondo que você ainda precisará de um executável separado porque as dlls você deseja substituir provavelmente arquivo bloqueado enquanto estiver em uso por um exe, como uma das respostas anteriores já disse.

Eu escrevi o meu próprio AutoUpdater, o AutoUpdater usa um arquivo de configuração comum para o aplicativo que contém URLs para baixar as últimas versões de / verificação se ele precisa de atualização.

Desta forma, você executar o atualizador, o que quer atualiza o aplicativo ou não, em seguida, executa o aplicativo, que como parte da operação normal, verificações para um atualizador atualizado e correções que.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top