Ações personalizadas do Windows Installer: a ação de confirmação não será executada
Eu estou projetando um projeto de instalador do windows usando o WIX. Agora ele falha na instalação, porque a ação customizada de Confirmação não será executada, o que é causado, estranhamente, porque uma ação customizada de sequência planejada tem uma rota para retornarActionResult.Success
. Deixe-me explicar em detalhes:
Basicamente eu tenho duas ações personalizadas com relação à instalação: uma chamada CommitCA e uma chamada InstallCA. O cronograma de execução está listado abaixo:
<CustomAction Id="CommitCA" BinaryKey="CustomActionDll" DllEntry="CommitCA" Execute="commit" Return="check" Impersonate="no"/>
<CustomAction Id="InstallCA" BinaryKey="CustomActionDll" DllEntry="InstallCA" Execute="deferred" Return="check" Impersonate="no"/>
Eu verifiquei do ORCA que no instalador compilado, o CommitCA está programado antes de InstallCA. O tipo de CommitCA é 3585 e o InstallCA é 3703 (não consigo encontrar a referência a eles, mas suponho que um é para ação de commit e o outro é uma ação deferida como declarei). A ideia é que no CommitCA ele irá gerar algum arquivo que será utilizado pela InstallCA.
A estrutura do meuInstallCA
se parece com isso:
Try
' Do some work
...
Catch ex As Exception
' Log the failure into installation log
Return ActionResult.Failure
End Try
Return ActionResult.Success
Aí vem a parte confusa: originalmente eu tenho uma versão de trabalho, onde eu não tinha a linha de retornoActionResult.Failure
noCatch
quadra. Em outra palavra, a função ainda registra a falha, mas eventualmente retornaSuccess
mesmo se uma exceção foi lançada. Eu acho um pouco enganador, porque às vezes quando acontece uma exceção e eu verificar o log, ele diz que a ação personalizada foi bem-sucedida. É por isso que eu adicionei a linha
Return ActionResult.Failure
No entanto, agora não funciona mais! Sempre que eu instalo, acho que meuCommitCA
nunca é executado. NOTA: não oInstallCA
, que tem a única modificação de código que fiz, mas oCommitCA
, que na verdade está programado antes doInstallCA
. E quando eu digo "nunca é executado", quero dizer que não consigo encontrar qualquer entrada de log que eu coloquei dentro das chamadas de função, eMMSIBREAK
variável de ambiente nem funciona (a janela que me informa para anexar ao processo rundll32 nunca aparece). Mas o seguinteInstallCA
ainda é executado.
Se eu comentar a linhaReturn ActionResult.Failure
, tudo funciona de novo: eu posso ligar para entrarCommitCA
eInstallCA
é chamado também.
Provavelmente, há algo que eu não entendi sobre o resultado de retorno da ação personalizada. Eu não deveria voltar?ActionResult.Failure
nesta situação? Mas na verdade eu voltoActionResult.Failure
em alguns outros lugares também. Na verdade, noCommitCA
função em si, usei a mesma estrutura: retornandoActionResult.Failure
noCatch
quadra. Então alguém poderia me dizer o que eu fiz de errado?