Pergunta

Como podemos solicitar a reinicialização do computador após a instalação a partir de uma ação personalizada do C#?

Estamos usando o projeto de configuração do VS 2005 para nossa configuração e precisamos decidir programaticamente solicitar uma reinicialização (para que isso não aconteça em todas as instalações, apenas em algumas).

ATUALIZAR:Estamos procurando primeiro algo que já esteja integrado ao sistema de ação personalizada da MSI.Se isso não existir, podemos recorrer à reinicialização do PC de alguma forma, mas gostaríamos de evitar isso.

ATUALIZAR:Vemos onde você pode definir REBOOT=Force ao editar o Msi no Orca. Você pode modificar essas tabelas a partir de uma ação personalizada C# em tempo de execução?Poderíamos configurá-lo para reiniciar sempre, mas isso pode tornar nossa configuração irritante (ela só precisará ser reiniciada em raras ocasiões).

ATUALIZAR:Tentamos configurar:

savedState["REBOOT"] = "Force";

De dentro do método Install() da nossa ação personalizada, mas sem sorte.Não parece que o IDictionary, saveState realmente faça alguma coisa.

Também tentei:

Context.Parameters["REBOOT"] = "Force";

Mas acho que esta coleção é apenas os argumentos da linha de comando passados ​​para a ação personalizada.

ATUALIZAR:Existe uma maneira de editar nosso MSI com o Orca para que esse truque funcione?Talvez agendar uma reinicialização sob a condição de algum arquivo existir?Não descobrimos como definir propriedades MSI a partir de uma ação personalizada C#.

ATUALIZAR:Tentamos conectar-se a AppDomain.ProcessExit e AppDomain.DomainUnload e iniciar um novo thread e chamar Process.GetCurrentProcess().WaitForExit() e nenhum desses eventos será acionado de dentro de uma ação personalizada C#...

Foi útil?

Solução 2

Ao que parece, a única maneira de resolvermos isso é:

A) Modifique o MSI com orca para reiniciar a configuração a cada instalação

B) Refaça o projeto de configuração com WiX ou Install Shield

Obrigado pela ajuda pessoal.

Outras dicas

Você precisa adicionar ou chamar a ação personalizada MSI ScheduleReboot http://msdn.microsoft.com/en-us/library/aa371527(VS.85).aspx em seu InstallExecuteSequence, .Você pode fazer isso usando a função MSI MsiDoAction, http://msdn.microsoft.com/en-us/library/aa370090(VS.85).aspx dentro de uma ação personalizada.Observe que a ação personalizada que agenda isso deve ser uma ação personalizada imediata, não uma ação personalizada adiada.Isso significa que você provavelmente precisará agendá-lo após o InstallFinalize.Você também pode adicioná-lo ao InstallExecuteSequence com uma condição em uma propriedade pública definida por sua ação personalizada.

Quando tive que fazer isso antes de usarmos uma função de API Win32 de user32.dll, acho que foi isso: Sair do WindowsEx()

LanceSc lhe deu a resposta.Você precisa executar ScheduleReboot, e a melhor maneira de fazer isso é inseri-lo no InstallExecuteSequence condicionado por sua própria propriedade customizada que você definiu dentro de sua ação customizada.

Como você mencionou, o Wix é o caminho certo para flexibilidade futura.O Wix agora também inclui DTF (Deployment Tools Foundation), que é um rico conjunto de bibliotecas de classes .NET que agrupam toda a API do Windows.Você pode usar isso para acessar facilmente bancos de dados MSI a partir de C# ou para escrever ações personalizadas em C#.Posso fornecer mais informações sobre isso, se desejar.

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