Como passar o CustomActionData para um CustomAction usando o WiX?

Como as propriedades são definidas em CustomActionData para serem recuperadas por uma ação personalizada adiada?

Ações personalizadas adiadas não podem acessar diretamente as propriedades do instalador ( referência ). Na verdade, apenas a propriedade CustomActionData

 session.CustomActionData 

e outros methods e propriedades listados aqui estão disponíveis no object da session.

Portanto, para uma ação personalizada deferida para recuperar uma propriedade como o INSTALLLOCATION , você precisa usar uma ação personalizada de tipo 51 – ou seja, uma ação personalizada de propriedade de conjunto – para transmitir essas informações e consumir os dados do C # de CustomAction código através de session.CustomActionData . (ver referência e referência )

Abaixo está um exemplo de uma ação personalizada de tipo 51 ( CustomAction1 ) que definirá uma propriedade que pode ser recuperada em CustomAction2 .

  

Observe que o nome do atributo de Property é CustomAction2 . Isso é importante. O valor do atributo Property da ação type 51 deve ser igual / idêntico ao nome da ação customizada que está consumindo CustomActionData . (ver referência )

Observe o nome SomeCustomActionDataKey no par de chave / valor do atributo Valor? Em seu código C # na ação personalizada de consumo ( CustomAction2 ), você consultará essa propriedade em CustomActionData usando a seguinte expressão:

 string somedata = session.CustomActionData["SomeCustomActionDataKey"]; 

A chave usada para recuperar o valor de CustomActionData NÃO é o valor em Property attribute da ação personalizada de tipo 51, mas a chave do par key=value no atributo Value . ( Nota importante: CustomActionData é preenchido pela configuração de uma propriedade do instalador com o mesmo nome que o ID da ação personalizada de consumo, mas as chaves CustomActionData NÃO são propriedades do instalador. ) (Consulte a referência )

Em nosso cenário, a ação customizada de consumo é uma ação customizada adiada, definida da seguinte forma:

   

Configurando o InstallExecuteSequence

Obviamente, a ação personalizada de consumo ( CustomAction2 ) deve ser executada após a ação personalizada de tipo 51 ( CustomAction1 ). Então você terá que agendá-los assim:

      

Para nós, schlubs C ++, você recupera a propriedade da seguinte maneira:

 MsiGetProperty(hInstall, "CustomActionData", buf, &buflen); 

Então você analisa ‘buf’. Obrigado a Bondbhai .

Se o valor passado para a ação personalizada não for um conjunto de chave / par …

ou seja

   

… então o blob inteiro pode ser recuperado usando:

 string data = session["CustomActionData"];