Tudo bem agendar RemoverexistingProducts Ação personalizada antes do InstallateLidate?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Problema

Eu tenho um MSI que cria e inicia um serviço do Windows durante a instalação e para e remove o serviço durante a desinstalação. Isso funciona bem ao instalar e desinstalar por si só, mas ao atualizar, o Arquivos em uso A caixa de diálogo é exibida (apenas no Vista e posterior devido ao novo Reinicie o gerente), indicando que o serviço está em uso.

Fundo

o Arquivos em uso A caixa de diálogo é exibida durante o Installexecute Sequência pelo InstallValidate ação personalizada, que é agendada imediatamente antes do Remova os produtores de existência ação personalizada; Isso significa que a versão anterior ainda não foi desinstalada, então o Arquivos em uso diálogo deve ser mostrado.

A documentação do MSDN indica que o Remova os produtores de existência a ação deve ser agendada após o InstallValidate ação, e eu atualmente tenho o Remova os produtores de existência ações agendadas imediatamente após o InstallValidate ação.

Solução potencial

Eu gostaria de reagendar o Remova os produtores de existência ação personalizada para imediatamente antes do InstallValidate ação personalizada para que a instalação anterior tenha a chance de parar e remover o serviço antes do Arquivos em uso A caixa de diálogo é mostrada. Eu tentei remarcar as ações e parece funcionar corretamente sem efeitos colaterais adversos (embora o log ainda indique que o InstallValidate ação é executada antes do Remova os produtores de existência ação), mas hesito em usar essa solução, pois viola a documentação do MSDN, e pode haver efeitos adversos que ainda não estou vendo.

alguem ja tentou isso? A única outra alternativa que consigo pensar é que a nova instalação interrompe o serviço da instalação antiga, mas isso é indesejável porque exige que a instalação tenha informações sobre todas as instalações antigas que ele pode atualizar (interromper esse serviço específico pode envolver mais do que apenas uma simples chamada para o gerente de serviço para impedi -lo).

Foi útil?

Solução

Eu implementei a solução potencial descrita na pergunta, agendando Remova os produtores de existência imediatamente antes InstallValidate. Ainda não vi nenhum problema, mas postarei novamente após a instalação obter mais uso.

Atualizar

Nossa instalação usa isso há algum tempo e não notei nenhum efeito mal.

Outras dicas

Já foi incorporado ao instalador MSI / Windows ... O único problema é que as classes do .NET Installer não usam os recursos de "instalação do serviço" do MSI. O que está realmente acontecendo é que o MSI está tentando instalar arquivos e executar um comando personalizado usando os arquivos que acabam de copiar (tudo o que é o Visual Studio está colocando o MSI).

Para resolvê -lo, você pode editar o MSI com orca e adicionar a seguinte linha ao ServiceControl tabela:

1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D

O ID do componente que você pode procurar na tabela de arquivos ... Acabei de escolher o ID do componente do arquivo exe principal. O 170 é um bitmap que diz ao instalador do Windows para parar e excluir o serviço ao instalar e desinstalar.

Isso limpará a estrada para os instaladores do .NET adicionar serviço e você poderá usar o ServiceController para iniciar o serviço depois que ele foi instalado via comando personalizado.

Um problema em potencial seria que, se o usuário cancelar durante o InstallValidate (por exemplo, devido ao espaço de disco não suficiente ou a um arquivo em uso) ou durante a instalação, qual é o comportamento da reversão. A situação ideal é que o estado do aplicativo é o mesmo de antes (por exemplo, o aplicativo anterior é instalado). Você pode estar desistindo disso com seu sequenciamento, embora a reversão possa ser um recurso que você possa viver sem.

Eu acho que este irá ajudá -lo sem violar a documentação do MSDN e evitar problemas futuros. Coloque uma condição "instalada ou anteriorsões instantâneas" e você também será bom no upgrade, pois a propriedade anteriorsõesInstala é definida antes da ação do Installidate durante o FindrelatedProducts. Não sei por que, mas a propriedade anterior As versões Instaladas não está documentada no MSDN, mas ela existe e é muito útil para mim.

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